【问题标题】:Access Value in For Loop Twice Oracle在 For 循环两次 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:缺少或无效的同义词标识符”。

标签: oracle plsql sqlplus


【解决方案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 格式。让我检查一下。
猜你喜欢
  • 2019-01-13
  • 2023-03-29
  • 2021-01-26
  • 2016-10-29
  • 1970-01-01
  • 2013-05-02
  • 1970-01-01
  • 1970-01-01
  • 2014-07-12
相关资源
最近更新 更多