簡體   English   中英

Oracle PL / SQL-如何使用動態SQL插入多行

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM