Вставка записи типа строки, которая передается как параметр в PL / SQL в Oracle. Как мне этого добиться? - PullRequest
0 голосов
/ 15 апреля 2020

Я пытаюсь достичь ниже сценария. Как я могу достичь ниже вставки, приведенной ниже?

declare
v_insSql varchar2(1000);
v_table_name varchar2(50):='TEMP_TBL';
v_row Table_T1%ROWTYPE;
/* Just to avoid everyone's confusion, both table_t1 and temp_tbl are of same structure */

BEGIN
SELECT * INTO v_row FROM Table_T1 WHERE ROWNUM = 1;
v_insSql:= 'INSERT INTO '||v_table_name||' VALUES :l_row';
/* table_name will always be passed as variable */
    EXECUTE IMMEDIATE v_insSql using v_row;
END;

Может кто-нибудь PLS помочь?

Ответы [ 2 ]

1 голос
/ 15 апреля 2020

Не использовать динамический c SQL; просто используйте обычную SQL вставку:

DECLARE
  v_insSql varchar2(1000);
  v_table_name varchar2(50):='TEMP_TBL';
  v_row Table_T1%ROWTYPE;
BEGIN
  SELECT * INTO v_row FROM Table_T1 WHERE ROWNUM = 1;
  INSERT INTO temp_tbl VALUES v_row;
END;
/

Итак, для некоторых примеров таблиц / данных:

CREATE TABLE table_t1 ( a NUMBER, b NUMBER, c NUMBER );
INSERT INTO table_t1 ( a, b, c ) VALUES ( 1, 2, 3 );
CREATE TABLE temp_tbl AS SELECT * FROM table_t1 WHERE 1 = 0;

Тогда:

SELECT * FROM temp_tbl;

Выходы:

 A |  B |  C
-: | -: | -:
 1 |  2 |  3

дБ <> скрипка здесь


Если вы хотите иметь динамический c стол имена, а затем занести в белый список таблицы, чтобы вам не приходилось использовать Dynami c SQL:

DECLARE
  v_insSql varchar2(1000);
  v_table_name varchar2(50):='TEMP_TBL';
  v_row Table_T1%ROWTYPE;
BEGIN
  SELECT * INTO v_row FROM Table_T1 WHERE ROWNUM = 1;
  IF v_table_name = 'TEMP_TBL' THEN
    INSERT INTO temp_tbl VALUES v_row;
  ELSIF v_table_name = 'TABLE_T1' THEN
    INSERT INTO table_t1 VALUES v_row;
  END IF;
END;
/

db <> fiddle здесь

0 голосов
/ 18 апреля 2020

Вы можете получить то, что хотите, но с промежуточным этапом определения и заполнения переменной% rowtype. Поскольку исходная таблица (Table_T1) и целевая таблица (Temp_Tbl) должны иметь идентичную структуру, которую вы вставляете непосредственно для выбора.

declare                                                                
   k_sql_stmt   constant varchar2(100) := 'insert into <table_name> select * from table_t1 where rownum=1';
   l_sql_stmt   varchar2(100);
   l_table_name varchar2(30) := 'temp_tbl'; 
begin 
   l_sql_stmt := replace(k_sql_stmt,'<table_name>',l_table_name); 
   dbms_output.put_line ('Run Statement==> ''' || l_sql_stmt || '''');
   execute immediate l_sql_stmt;  
end ;  
...