1

この質問について@ShannonSeveranceから素晴らしい回答がありました

50以上の列名を入力せずに同じテーブルの行をコピーする(2列を変更しながら)

テーブル内の行を同じテーブルに動的にコピーする方法を示しました (pk の変更)

declare
r table_name%ROWTYPE;
begin
select *
into r
from table_name
where pk_id = "original_primary_key";
-- 
select pk_seq.nextval into r.pk_id from dual;
 -- For 11g can use instead: r.pk_id := pk_seq.nextval;
r.fk_id := "new_foreign_key";
insert into table_name values r;
end;

このアプローチを適用したいのですが、テーブル名の配列内から毎回呼び出される関数内で

したがって、基本的には execute immediately を使用して選択を実行できますが、「r」を宣言するにはどうすればよいですか? コード内の「table_name」を、関数に渡される変数に置き換えることはできますか?

table(1)="Table1";

table(2)="Table2";

for t 1..table.count loop
 CopyTableContacts(table(i));
end loop;

ティア

マイク

4

1 に答える 1

0

最後に、関数を少し修正しました

私は今2つのアレイを構築します

1 - USER_TAB_COLUMNS テーブルのテーブル名のリスト 2 - array1 のテーブルごとに、ALL_TAB_COLUMNS テーブルの列名のコンマ区切りリストを作成します

したがって、2つの配列になります(例...)

tableName(1) = 'MEMBER'
tableName(2) = 'SALARY'

tableColumns(1) = 'ID, SURNAME, SEX, DOB'
tableColumns(2) = 'ID, CURRENTSAL, BONUS, GRADE'

次に、これら 2 つの配列値を関数に渡し、tableName() 配列のループ中に動的 SQL を使用します...

PROCEDURE CopyTableRow(inOrigMemNo NUMBER, inNewMemNo NUMBER, inTableName USER_TAB_COLUMNS.TABLE_NAME%TYPE, inTableString LONG) AS
selectString VARCHAR2(32000):=null;
newTableString LONG:=null;
insertTableString LONG:=null;
sqlResultCount NUMBER:=0;
BEGIN
/*CHECK IF THERE IS AT LEAST ONE ROW TO COPY*/
EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM ' || inTableName || ' WHERE ID= ' || inOrigMemNo INTO sqlResultCount;
IF sqlResultCount > 0 THEN
  /*BUILD INSERT STATEMENT FOR EACH ROW RETURNED*/
  dbms_output.put_line('At least one row found on ' || inTableName || '(' || sqlResultCount || ')');

  newTableString    := REPLACE(inTableString, 'ID', 'REPLACE(ID, ID,' || inNewMemNo || ')');
  selectString      := 'SELECT ' || newTableString || ' FROM ' || inTableName || ' WHERE ID = ' || inOrigMemNo;
  insertTableString := 'INSERT INTO ' || inTableName || '(' || inTableString || ') (' || selectString || ')';
    END IF;

次に、実行できるテーブル定義と値に基づいた INSERT ステートメントが残ります。

これはうまく機能しているようで、現在のニーズに合っています

- 各テーブルにコピーする行が 1 つしかない場合にのみ機能します。私の次の課題は、コピーが必要な ID に対して複数の行を返すいくつかのテーブルに対処することです (これは、カーソル以外のコーナーに自分自身をペイントしたので、興味深いものになるでしょう!)

マイク

于 2013-09-25T12:41:36.293 に答える