创建相关表的SELECT 语句(排除指定字段)的代码

create or replace procedure sql_create(
  i_tbname
varchar2,         -- 默认大写(可以写成小写,但我会将其转换成大小去比较,这里可以按照你的需求去更改)
  i_except_columns varchar2, -- 要排除的字段名,多个字段用逗号(,)隔开(因为Oracle里面的字段默认均为大写,所以输入时要注意,当然可以用upper()函数,那是后话)
  o_sql out varchar2
)
is
  v_sqls
varchar2(4000);
  i_except_columns2
varchar2(4000);
  v_sql
varchar2(4000);
  v_cnt
number(18,0);
begin
  v_sql :
= '';
  i_except_columns2 :
=''''||replace(upper(i_except_columns),',',''',''')||'''';
 
execute immediate 'select count(1) from user_tables where table_name=upper(:i_tbname)' into v_cnt using i_tbname; -- 看是否存在大写名字的表
  if v_cnt = 1 then
 
begin
    v_sqls :
= 'select trim(regexp_replace(wm_concat((case when m.column_name<>upper(m.column_name) then ''       "''||m.column_name||''"'' else ''       ''||m.column_name end)),'','','',''||chr(10))) as columnNames
      from user_tab_columns m
     where m.table_name=upper(:i_tbname)
       and m.column_name not in (
'||i_except_columns2||')
     order by column_id asc
';
   
execute immediate v_sqls into v_sql using i_tbname;
    o_sql :
= 'SELECT '||v_sql||chr(10)||'  FROM '||i_tbname||';';
 
end;
 
else
 
begin
   
execute immediate 'select count(1) from user_tables where table_name=:i_tbname' into v_cnt using i_tbname; -- 看是否存在小写名字的表
    if v_cnt = 1 then
   
begin
      v_sqls :
= 'select trim(regexp_replace(wm_concat((case when m.column_name<>upper(m.column_name) then ''       "''||m.column_name||''"'' else ''       ''||m.column_name end)),'','','',''||chr(10))) as columnNames
        from user_tab_columns m
       where m.table_name=:i_tbname
         and m.column_name not in (
'||i_except_columns2||')
       order by column_id asc
';
     
execute immediate v_sqls into v_sql using i_tbname;

      o_sql :
= 'SELECT  '||v_sql||chr(10)||' FROM '||'"'||i_tbname||'"';
   
end;
   
else
      o_sql :
= '对不起,表名为 '||i_tbname||''||upper(i_tbname)||' 在当前用户 '||user||' 下均不存在! ';
   
end if;
 
end;
 
end if;
end;
/

-- select dbms_metadata.get_ddl('TABLE','MUSICMUSIC') from dual;

set serveroutput on;
var sqls varchar2(4000);
exec sql_create('musicmusic','musicid',:sqls);
print sqls;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值