【问题标题】:Dynamic SQL - ORACLE动态 SQL - ORACLE
【发布时间】:2017-02-08 08:48:46
【问题描述】:

我有以下过程,编译不正确,因为它引用了不存在的对象(表不存在) 这里只是代码的一部分(我使用了表和列的通用名称):

 DECLARE
      C INTEGER := 0;
    BEGIN
     SELECT COUNT(1) INTO C FROM USER_TABLES WHERE TABLE_NAME = 'MY_TABLE';
     IF C > 0 THEN
          DECLARE
            CURSOR c_maps IS SELECT COLUM_NAME1, COLUM_NAME2 FROM MY_TABLE WHERE ACTIVE = 1;
          BEGIN
            FOR prec IN c_maps LOOP
              some code...;
            END LOOP;
              EXECUTE IMMEDIATE 'some code..';
         END;
    END IF;
END;
/

我不知道如何动态写这个语句,因为表“MY_TABLE”不存在:

 CURSOR c_maps IS SELECT COLUM_NAME1, COLUM_NAME2 FROM MY_TABLE WHERE ACTIVE =1;

我也试过这样写:

CURSOR c_maps IS SELECT COLUM_NAME1, COLUM_NAME2 FROM (Select 'MY_TABLE' from dual) WHERE ACTIVE = 1;

但是,它指的是在编译时也不存在的列“ACTIVE”......可以在“立即执行”中编写整个过程 - 块?我尝试了不同的变体,但没有成功

【问题讨论】:

  • 构建列列表的游标必须是动态执行的一部分。嵌套的两层动态执行......理解和调试的噩梦。真的没有办法针对现有架构进行编码吗?

标签: sql oracle plsql


【解决方案1】:

您可能需要以不同的方式打开游标,以便仅在动态SQL中引用不存在的表;例如:

declare
    c      integer := 0;
    curs   sys_refcursor;
    v1     number;
    v2     number;
begin
    select count(1)
      into c
      from user_tables
     where table_name = 'MY_TABLE';

    if c > 0
    then
        open curs for 'select column_name1, column_name2 from my_table where active = 1';
        loop
            fetch curs into v1, v2;
            exit when curs%NOTFOUND;
            dbms_output.put_line(v1 || ' - ' || v2);
        end loop;
    else
        dbms_output.put_line('The table does not exist');
    end if;
end;
/

【讨论】:

    猜你喜欢
    • 2018-04-10
    • 2012-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-21
    • 2014-10-29
    • 2014-12-23
    • 1970-01-01
    相关资源
    最近更新 更多