在 For 循环两次 Oracle 中访问值

Posted

技术标签:

【中文标题】在 For 循环两次 Oracle 中访问值【英文标题】:Access Value in For Loop Twice Oracle 【发布时间】:2020-03-18 19:29:37 【问题描述】:

我试图在 for 循环中访问列值两次。在询问之前,我真的试图自己解决这个问题,但 Oracle 和/或 PL/SQL 并不是我的强项。第一次在该行中访问该值时,它就在那里。第二次它只是作为空的单括号''出现。任何帮助将不胜感激。

BEGIN

   FOR t IN (SELECT object_name, object_type FROM all_objects WHERE owner='USER' AND object_type IN ('TABLE','VIEW','PROCEDURE','FUNCTION','PACKAGE','PACKAGE BODY','LOB','SEQUENCE','SYNONYM','TYPE')) LOOP

     IF t.object_type IN ('SYNONYM') THEN
       --the second time t.object_name is called in line below it is empty.
       EXECUTE IMMEDIATE 'CREATE OR REPLACE SYNONYM NEW_USER.'||t.object_name||' FOR USER.'||t.object_name||'';

     END IF;

   END LOOP;

END;

/

【问题讨论】:

这就是为什么我总是将语句生成到变量中,然后执行恐吓变量名。当出现问题时,我可以输出尝试的实际语句。然而,对于这个;您实际上有一个模式名称 USER 吗?如果您的光标有结果,这是必要的 - 非常糟糕的计划。更重要的是,您是否有一个模式“NEW_USER”,因为这是您尝试创建同义词的地方。错误消息暗示架构“NEW_USER”不存在。如果 t_object_name 的值为 null(空),您将收到错误“ORA-00995:缺少或无效的同义词标识符”。 【参考方案1】:

使用变量:

DECLARE
   t_name VARCHAR2(30);

BEGIN

   FOR t IN (SELECT object_name, object_type FROM all_objects 
             WHERE owner='USER' 
               AND object_type IN ('TABLE','VIEW','PROCEDURE'
                                   ,'FUNCTION','PACKAGE','PACKAGE BODY'
                                   ,'LOB','SEQUENCE','SYNONYM','TYPE')) 
LOOP
     t_name:=DBMS_ASSERT.ENQUOTE_NAME(t.object_name);
     IF t.object_type IN ('SYNONYM') THEN

       --the second time t.object_name is called in line below it is empty.
       EXECUTE IMMEDIATE 'CREATE OR REPLACE SYNONYM NEW_USER.'||t_name||' FOR USER.'||t_name||'';
     END IF;
   END LOOP;
END;
 /

【讨论】:

不应该,分配给变量是确保获得相同值的最明显方法。让我检查一下。 @RobertHarvey 不,不是dbfiddle.uk/… 我的其他猜测是,标识符需要引用,因为它可能包含特殊字符/空字符(0x0) 这不起作用。我仍然收到错误消息 ORA-01917: user or role '' does not exist ORA-06512: at line 10 @R.Lansing 发布SELECT 的输出。我猜它包含该特定行的空格/制表符/任何特殊内容。 我不相信同义词名称有任何特殊字符。它们应该只是没有架构的 TABLE_NAME 格式。让我检查一下。

以上是关于在 For 循环两次 Oracle 中访问值的主要内容,如果未能解决你的问题,请参考以下文章

PHP & MySQLi - 在下拉列表中显示选定的值两次

在 PHP 和 MySQLi 的预处理语句中使用相同的值两次

Laravel json() 响应返回值两次

复制相同值两次时,可写计算变量不读取值

Nunjucks for 循环运行两次

我可以在 JavaScript 的不同 for 循环中声明相同的变量两次吗? [复制]