динамическое заполнение значения переменной в Oracle - PullRequest
0 голосов
/ 01 ноября 2018

У меня есть четыре таблицы, как показано ниже: Я хочу вставить значение переменной v_col в таблицу test. Это имя переменной хранится в другой таблице test_lkp.При попытке запустить код я получаю сообщение об ошибке. Как этого добиться.

DROP TABLE TEST ;
DROP TABLE TEST_LKP;
DROP TABLE TEST_REF;
DROP TABLE TEST_Q;
CREATE TABLE TEST (COL VARCHAR2(10));
CREATE TABLE TEST_LKP (COL VARCHAR2(10));
CREATE TABLE TEST_REF (VAL VARCHAR2(10));
CREATE TABLE TEST_Q (ENAME VARCHAR2(10));
INSERT INTO TEST_LKP VALUES ('v_col');
INSERT INTO TEST_REF VALUES ('ENAME');
INSERT INTO TEST_Q VALUES ('TOM');
INSERT INTO TEST_Q VALUES ('JIM');
INSERT INTO TEST_Q VALUES ('MARK');

COMMIT;

Фактический код:

  SET SERVEROUTPUT ON;
declare

   v_col  VARCHAR2(30);
    BEGIN
      SELECT VAL INTO v_col FROM TEST_REF;  
    dbms_output.put_line(v_col);

EXECUTE IMMEDIATE 
 ' INSERT  INTO TEST  SELECT '|| V_COL ||' FROM TEST_Q ' ;

END;
/

Ожидается, что оператор вставки будет динамически формироваться с помощью таблицы поиска, чтобы при изменении сценария можно было обрабатывать любые изменения в столбцах, а не изменять скрипт. Для этого я создал справочную таблицу TEST_LKP с той же структурой, что и TEST, и вставил значения в V_COL.

Это то, что я пытался

SET SERVEROUTPUT ON;
declare
   v_col  VARCHAR2(30);
   q VARCHAR2(1000);
  CURSOR c1 IS
SELECT
      'INSERT  INTO TEST '
      ||   
    'SELECT ' || COL || ' FROM TEST_Q '  DMLS   
    FROM TEST_LKP;
  BEGIN
  SELECT val INTO v_col FROM TEST_REF;  
    dbms_output.put_line(v_col);
  FOR i IN c1
   loop
  dbms_output.put_line(i.DMLS);
  execute immediate i.dmls;
  end loop;
END;
/

erorr:

Error report -
ORA-00904: "V_COL": invalid identifier
ORA-06512: at line 17
00904. 00000 -  "%s: invalid identifier"
*Cause:   
*Action:
ENAME
INSERT  INTO TEST SELECT v_col FROM TEST_Q

Ожидаемый:

i want v_col to be replaced with ENAME as

    INSERT  INTO TEST SELECT ENAME FROM TEST_Q

какое-нибудь решение для этого?

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