Запись с курсором в таблицу (имя таблицы в качестве параметра) - PullRequest
0 голосов
/ 24 июня 2019

Как я могу вставить в таблицу, используя CURSOR с именем в качестве параметра? Спасибо

PROCEDURE delta (pTableName IN VARCHAR2, pStichTag  IN DATE) IS 
   lTabName :=  VARCHAR(30);
   v_stmt_str := VARCHAR(4000); 
   cCursor SYS_REFCURSOR;
   BEGIN
       lTabName :=  substr(pTableName,5);
       v_stmt_str := 'SELECT * FROM '|| lTableName ||' WHERE dwh_date =     
       to_date('||pStichTag||','DD.MM.YY');

   OPEN cCursor  FOR v_stmt_str USING 'MANAGER';
   LOOP
       FETCH cCursor INTO pTableNAME%ROWTYPE;
       -- UPATE pTableName SET some WHERE this line
   END LOOP;
CLOSE cCursor;

Ответы [ 2 ]

1 голос
/ 24 июня 2019

Вам необходимо использовать EXECUTE IMMEDIATE для выполнения обновления:

EXECUTE IMMEDIATE 'UPDATE ' || pTableName ||
                  ' SET SOME_COLUMN = 12345 WHERE SOME_OTHER_COLUMN = ''xyz''';

Однако вам придется заново выполнить логику курсора.Поскольку вы не знаете имя таблицы, вы не знаете, какие поля будут выбраны до открытия курсора, поэтому вам придется жестко кодировать имена полей, которые нужно выбрать, вместо использования *.Если вам это не нравится, вам придется использовать пакет DBMS_SQL, который обеспечивает большую гибкость - но я предупреждаю, его довольно сложно использовать.

Удачи.

0 голосов
/ 24 июня 2019

Исправленный фрагмент кода

PROCEDURE delta (pTableName IN VARCHAR2, pStichTag  IN DATE) 
IS 
   lTabName  VARCHAR(30); -- removed :=
   v_stmt_str VARCHAR(4000); -- removed :=
   cCursor SYS_REFCURSOR;
   BEGIN
       lTabName :=  substr(pTableName,5); -- I dont understand why only first five digits of table name is used. May be your logic
       v_stmt_str := 'SELECT * FROM '|| lTableName ||' WHERE dwh_date =     
       to_date('''||pStichTag||''',''DD.MM.YY'')'; -- added few ' for proper string concatenation

   OPEN cCursor  FOR v_stmt_str USING MANAGER; -- removed ' from MANAGER, MANAGER must be some variable and for your cusrsor, there is no bind variable so there is no need of USING clause at all
-- You can use just: OPEN cCursor  FOR v_stmt_str;
   LOOP
       FETCH cCursor INTO pTableNAME%ROWTYPE;
       -- UPATE pTableName SET some WHERE this line
   END LOOP;
CLOSE cCursor;

Надеюсь, это будет полезно.

Ура !!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...