تبدو حيوي عن أسماء عمود لجدول بينما في استعلام SQL

StackOverflow https://stackoverflow.com/questions/205950

  •  03-07-2019
  •  | 
  •  

سؤال

وأنا أكتب SQL (أوراكل) مثل:

INSERT INTO Schema1.tableA SELECT * FROM Schema2.tableA;

وحيث يكون Schema1.tableA وSchema2.tableA نفس الأعمدة. ومع ذلك، يبدو أن هذا غير آمنة، لأن غير معروف ترتيب الأعمدة يعود في SELECT. ما يجب أن تقوم به هو:

INSERT INTO Schema1.tableA (col1, col2, ... colN) 
SELECT (col1, col2, ... colN) FROM Schema2.tableA;

وأنا أفعل هذا من أجل الكثير من الجداول باستخدام بعض النصوص، لذلك ما أود القيام به هو كتابة شيء من هذا القبيل:

INSERT INTO Schema1.tableA (foo(Schema1.tableA)) 
SELECT (foo(Schema1.tableA)) FROM Schema2.tableA;

وأين فو هو بعض السحر أنيق الذي يستخرج أسماء الأعمدة من جدول واحد وحزم لهم في بناء الجملة الملائمة. الأفكار؟

هل كانت مفيدة؟

المحلول

وهذا PL / SQL ينبغي أن نفعل ذلك:

declare
    l_cols long;
    l_sql  long;
begin
    for r in (select column_name from all_tab_columns
              where  table_name = 'TABLEA'
              and    owner = 'SCHEMA1'
             )
    loop
       l_cols := l_cols || ',' || r.column_name;
    end loop;

    -- Remove leading comma
    l_cols := substr(l_cols, 2);

    l_sql := 'insert into schema1.tableA (' || l_cols || ') select ' 
             || l_cols || ' from schema2.tableA';

    execute immediate l_sql;

end;
/

نصائح أخرى

وقد تحتاج إلى بناء ادخال البيانات ديناميكيا باستخدام <لأ href = "http://download.oracle.com/docs/cd/B28359_01/server.111/b28320/statviews_5429.htm#REFRN26277" يختلط = "نوفولو noreferrer "> USER_TAB_COLUMNS وتنفيذها باستخدام <لأ href =" http://download.oracle.com/docs/cd/B28359_01/appdev.111/b28370/executeimmediate_statement.htm#LNPLS01317 "يختلط =" نوفولو noreferrer "> EXECUTE الفوري .

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top