插入行类型记录,该记录在Oracle中的PL / SQL中作为参数传递。我该如何实现?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了插入行类型记录,该记录在Oracle中的PL / SQL中作为参数传递。我该如何实现?相关的知识,希望对你有一定的参考价值。

我正在尝试实现以下方案。我如何实现下面给出的插入?

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;

有人可以帮忙吗?

答案

不要使用动态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

db <>小提琴here


如果要使用动态表名,则将表列入白名单,这样就无需使用动态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 <>小提琴here

另一答案

您可以通过定义和填充%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 ;  

以上是关于插入行类型记录,该记录在Oracle中的PL / SQL中作为参数传递。我该如何实现?的主要内容,如果未能解决你的问题,请参考以下文章

Oracle PL/SQL 第五章–复合类型

将值插入记录类型表

在 Oracle APEX 中基于“行选择器”插入记录

Oracle 12 PL/SQL 在触发器中检索存储过程名称

Oracle_PL/SQL 游标

在 oracle pl/sql 中如何选择嵌套类型?