在 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 中访问值的主要内容,如果未能解决你的问题,请参考以下文章