2015-02-06 165 views
1

我正在使用Oracle 11g數據庫的傳統應用程序工作,並且遇到了一個問題,我有5個表都以不同架構具有相同的數據結構。我需要能夠將數據插入到這些表中,我試圖避免重複的代碼。是否可以在SQL中使用變量作爲表名?

我知道這樣做以下

IF p_schema = SCHEMA1 THEN 
    INSERT INTO SCHEMA1.TABLE_NAME_SCHEMA1 (...) VALUES (...) 
ELSIF p_schema = SCHEMA2 THEN 
    INSERT INTO SCHEMA2.TABLE_NAME_SCHEMA2 (...) VALUES (...) 
ELSIF p_schema = SCHEMA3 THEN 
    INSERT INTO SCHEMA3.TABLE_NAME_SCHEMA3 (...) VALUES (...) 
ELSIF p_schema = SCHEMA4 THEN 
    INSERT INTO SCHEMA4.TABLE_NAME_SCHEMA4 (...) VALUES (...) 
ELSIF p_schema = SCHEMA5 THEN 
    INSERT INTO SCHEMA5.TABLE_NAME_SCHEMA5 (...) VALUES (...) 
END IF; 

有沒有什麼辦法,使表名在SQL中的變量,這樣我就可以做一個INSERT語句,但插入到我想要的表?

+1

請描述你的努力和迄今結果。 – 2015-02-06 19:39:20

回答

0

可以使用動態SQL

declare 
    schema_name varchar2(50); 
begin 
    v_name := 'SCHEMA1'; -- set the value of schema, you can do it in a loop also 
    execute immediate 
     'INSERT INTO '||schema_name ||'.TABLE_NAME_SCHEMA1 (...) VALUES (...)'; 
    commit; 
end; 
3

你能嗎?有了動態SQL,當然。你應該?只有5個表格,我不確定動態SQL的額外複雜性是否值得。

p_sql_stmt := 'INSERT INTO ' || p_schema || '.TABLE_NAME (<<columns>>) ' || 
       ' VALUES(?, ?, ?, ?, ?, ... ?) '; 
EXECUTE p_sql_stmt 
    USING val1, val2, val3, val4, ... , valN; 

如果你是所有常用做這樣的事情(而不是在尋找一條有這個醜陋的IF代碼),假設你有一個基本的OLTP應用程序,讓你做很多單行插入觸發器的開銷不會很糟糕,我可能會考慮創建一個視圖,該視圖執行5個表中的UNION ALL以及一個標識符,該標識符告訴您該數據來自哪個表以及一個INSTEAD OF觸發器將INSERT指引到適當的表格。然後,您的其他所有代碼都可以引用一個視圖,而不是在整個地方都有IF聲明。像

CREATE VIEW composite_view 
AS 
SELECT 'Schema1' schema_name, a.* 
    FROM schema1.table_name a 
UNION ALL 
SELECT 'Schema2' schema_name, b.* 
    FROM schema2.table_name b 
... 

而在INSTEAD OF INSERT觸發

IF(:new.schema_name = 'Schema1') 
THEN 
    INSERT INTO schema1.table_name(<<columns>>) 
    VALUES(:new.col1, :new.col2, ...); 
ELSIF(:new.schema_name = 'Schema2') 
THEN 
    INSERT INTO schema2.table_name(<<columns>>) 
    VALUES(:new.col1, :new.col2, ...); 
... 
2

東西,我想你可以使用這個insert allinsert first。喜歡的東西:

INSERT FIRST 
    WHEN p_schema = 'SCHEMA1' THEN INTO SCHEMA1.TABLE_NAME_SCHEMA1(. . .) 
    WHEN p_schema = 'SCHEMA2' THEN INTO SCHEMA2.TABLE_NAME_SCHEMA2(. . .) 
    . . . 
    . . .; 
0

我認爲解決這個問題的最好辦法是使用過程中,其使用顯示here

CREATE OR REPLACE TYPE employeeType AS OBJECT (employeeId INT, employeeName VARCHAR2(50)); 
-- this is how you can use variables 
CREATE TYPE ttEmployeeType AS TABLE OF employeeType; 

CREATE PROCEDURE testCustom (pLocation ttEmployeeType) 
AS 
BEGIN 
     INSERT 
     INTO employee (emp_id, emp_name) 
     SELECT * 
     FROM TABLE(pLocation); 
END; 
相關問題