[英]How can I insert new rows into a query result using PL/SQL or SQL query in Oracle?
[英]Oracle PL/SQL - How can I insert multiple rows using dynamic SQL
我想遍歷所有表並將ID和表名復制到表中。 由於必須使用變量作為表名,因此我嘗試了IMMEDIATE EXECUTE。 但是對於動態SQL,INSERT INTO語句僅允許單行。
如果 IMMEDIATE EXECUTE允許INSERT INTO具有多個行, 則將使用以下SQL語句。
DECLARE
sqlStat VARCHAR2(500);
BEGIN
FOR TName IN (
SELECT TABLE_NAME FROM all_tab_cols WHERE column_name='ID'
)
LOOP
sqlStat := 'INSERT INTO storeTab (ID,TABLE_NAME) SELECT ID, '' :1 '' FROM :2';
EXECUTE IMMEDIATE sqlStat USING TName.TABLE_NAME,TName.TABLE_NAME;
END LOOP;
END;
如何遍歷表格並收集記錄?
insert ... select
可以插入多行,無論它是通過“普通” SQL,通過PL / SQL還是通過動態SQL執行的。
但是您不能在動態SQL中使用占位符作為標識符(名稱)。 您需要連接查詢。 如果通過USING
子句傳遞值,則無需使用單引號:
DECLARE
sqlStat VARCHAR2(500);
BEGIN
FOR TName IN (SELECT TABLE_NAME FROM all_tab_cols WHERE column_name='ID' and table_name = 'FOO')
LOOP
sqlStat := 'INSERT INTO storetab (ID,TABLE_NAME) SELECT ID, :1 FROM '||tname.table_name;
EXECUTE IMMEDIATE sqlStat USING TName.TABLE_NAME;
END LOOP;
END;
/
這會將與源表中的行一樣多的行插入到storetab
中。
有點無關,但是:
如果當前用戶有權使用不同模式的那些表,則all_tab_columns
可能會多次返回相同的表名。 您應該通過從all_tab_columns and adjust the
選擇owner
來適當地處理該問題, all_tab_columns and adjust the
part of the dynamic SQL accordingly. Or use
all_tab_columns and adjust the
select part of the dynamic SQL accordingly. Or use
part of the dynamic SQL accordingly. Or use
如果您僅對當前用戶擁有的表感興趣,請part of the dynamic SQL accordingly. Or use
user_tab_cols`。
我更喜歡使用USER_TAB_COLUMNS,因為不需要在表名后附加架構名。 如果我們使用ALL_TAB_COLS,那么最好使用OWNER。
您也可以使用USER_TAB_COLUMNS來按以下方式構建查詢框架。
DECLARE
sqlStat VARCHAR2(500);
BEGIN
FOR TName IN (SELECT TABLE_NAME FROM USER_TAB_COLUMNS WHERE column_name='ID')
LOOP
sqlstat := 'INSERT INTO storeTab (ID,TABLE_NAME) SELECT ID, ''' ||TName.TABLE_NAME|| ''' FROM '||Tname.TABLE_NAME ;
EXECUTE IMMEDIATE sqlStat ;
END LOOP;
END;
或從ALL_TAB_COLS獲取
DECLARE
sqlStat VARCHAR2(500);
BEGIN
FOR TName IN (SELECT OWNER,TABLE_NAME FROM ALL_TAB_COLS WHERE column_name='ID')
LOOP
sqlStat := 'INSERT INTO storeTab (ID,TABLE_NAME) SELECT ID, ''' ||TName.TABLE_NAME|| ''' FROM '||Tname.OWNER||'.'||Tname.TABLE_NAME;
EXECUTE IMMEDIATE sqlStat ;
END LOOP ;
END ;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.