首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >动态SQL - ORACLE

动态SQL - ORACLE
EN

Stack Overflow用户
提问于 2017-02-08 16:48:47
回答 1查看 85关注 0票数 0

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

代码语言:javascript
复制
 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“并不存在:

代码语言:javascript
复制
 CURSOR c_maps IS SELECT COLUM_NAME1, COLUM_NAME2 FROM MY_TABLE WHERE ACTIVE =1;

我也试着写成这样:

代码语言:javascript
复制
CURSOR c_maps IS SELECT COLUM_NAME1, COLUM_NAME2 FROM (Select 'MY_TABLE' from dual) WHERE ACTIVE = 1;

然而,它引用的列"ACTIVE“也不存在于编译块中,是否可以在"execute immediate”块中写入整个过程?- time...It?我尝试过不同的变种,但是没有成功。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-08 16:57:18

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

代码语言:javascript
复制
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;
/
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42108450

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档