Значение доступа в For L oop Twice Oracle - PullRequest
1 голос
/ 18 марта 2020

Я пытаюсь получить доступ к значению столбца дважды в a для l oop. Я действительно пытался выяснить это самостоятельно, прежде чем спрашивать, но 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;

/

1 Ответ

0 голосов
/ 18 марта 2020

Использование переменной:

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;
 /
...