【问题标题】:Dynamic Function- Oracle动态函数 - Oracle
【发布时间】:2016-10-11 20:53:53
【问题描述】:

我试图通过提供 2 个变量作为输入来创建一个函数。这两个变量在函数中动态使用。我在循环开始时使用 select 语句来查找特定表中的主键列。此列分配给变量 value1。我正在使用这个 value1 变量作为序列变量。

create FUNCTION Test(schemaname in varchar2, tablename in varchar2)
return number
IS cnpParmId NUMBER;
good VARCHAR(1) := 'F';
exist VARCHAR(1) := 'F';
value1 varchar2(500);
  
begin
good  := 'F';
exist := 'F';
loop
   SELECT cols.column_name into value1
        FROM all_constraints cons, all_cons_columns cols
        WHERE cols.TABLE_NAME= 'tablename' 
        And cols.OWNER='schemaname'
        And cons.constraint_type = 'P'
        AND cons.constraint_name = cols.constraint_name
        AND cons.owner = cols.owner
        ORDER BY cols.table_name, cols.position; 
  
   select schemaname.value1_seq.nextval into cnpParmId from dual;
   begin
      select 'T' into good from dual 
      where cnpParmId not in 
      (select value1 from schemaname.tablename);
      exception when NO_DATA_FOUND then good := 'F';
   end;
   exit when good = 'T';
end loop;
return cnpParmId;
end;
/

Test(XYZ,ABC);

但出现以下错误:

错误(21,11):PLS-00487:对变量“SCHEMANAME”的引用无效

错误(21,22):PL/SQL:ORA-02289:序列不存在

错误(23,7):PL/SQL:SQL 语句被忽略

错误(25,38):PL/SQL:ORA-00942:表或视图不存在

【问题讨论】:

    标签: oracle stored-procedures plsql plsqldeveloper dynamicquery


    【解决方案1】:

    当您将变量作为表名或列名引入时,您需要使用EXECUTE IMMEDIATE 进行动态查询。

    您的序列查询应该是:

    execute immediate 'select ' || schemaname || '.nextval from dual' into cnpParmId;
    

    您的“获取返回值”查询应该是:

    execute immediate
      'select ''T'' from dual where cnpParmId not in ' ||
      '(select value1 from ' || schemaname || '.' || tablename || ')' into good;
    

    另请注意,您获取 value1 的查询正在寻找 literalschemanametablename

    SELECT cols.column_name into value1
        FROM all_constraints cons, all_cons_columns cols
        WHERE cols.TABLE_NAME= 'tablename'
        And cols.OWNER='schemaname'
        ... and so on
    

    可以使用变量来表示值,因此只需去掉变量名周围的单引号即可:

    SELECT cols.column_name into value1
        FROM all_constraints cons, all_cons_columns cols
        WHERE cols.TABLE_NAME= tablename
        And cols.OWNER=schemaname
        ... and so on
    

    【讨论】:

      猜你喜欢
      • 2016-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-03
      • 2020-06-02
      • 1970-01-01
      相关资源
      最近更新 更多