插入行类型记录,该记录在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中作为参数传递。我该如何实现?的主要内容,如果未能解决你的问题,请参考以下文章