2016-01-04 85 views
0

我試着寫,可以採取列名作爲輸入參數,並從表中選擇該列的過程。甲骨文:選擇用戶選擇列在議事

我知道你可以在常規查詢簡單地創建一個字符串變量和引用列像這樣做:

DEFINE mycol = 'column1' 

SELECT a.&mycol FROM table1 a 

這並沒有然而,在過程中工作。過程中的變量看起來不能被'&'符號引用,因此當我嘗試使用輸入參數拉列時,它會告訴我這是一個無效的標識符。

在互聯網上搜索的時候,我不能找人做這無動態SQL的一個例子,一個進程內時。如果可能,我寧願不使用動態SQL。

有沒有人知道這個解決方法,或者是需要在特效的動態SQL這發生?

乾杯,

奧利

回答

2

動態SQL命名塊作爲符號結構不符合SQL標準是必然的。這只是SQL Plus引擎的功能。

+0

夠公平的。真正的恥辱 - 看起來像是能夠做到的非常方便的事情! – user3639207

1

如所描述的我已經測試的方案。

CREATE TABLE SCOTT.COLUMN_LIST 
(
    COLUMN_ID    NUMBER, 
    COLUMN_NAME  VARCHAR2(200), 
    TABLE_NAME   VARCHAR2(50) 
); 

Insert into SCOTT.COLUMN_LIST 
    (COLUMN_ID, COLUMN_NAME, TABLE_NAME) 
Values 
    (1, 'DEPTNO', 'DEPT'); 
COMMIT; 

CREATE TABLE SCOTT.TEST1 
(
    A VARCHAR2(300 BYTE) 
); 

CREATE OR REPLACE PROCEDURE PROC1 
IS 
v_Select_Column VARCHAR2(200); 
v_Table_Name VARCHAR2(50); 
V_SQL    VARCHAR2(300); 

BEGIN 

SELECT COLUMN_NAME,TABLE_NAME 
INTO v_Select_Column,v_Table_Name 
FROM COLUMN_LIST 
WHERE COLUMN_ID=1; 

V_SQL:= 'SELECT '||v_Select_Column|| 
       ' FROM '||v_Table_Name; 

EXECUTE IMMEDIATE V_SQL; 

INSERT INTO TEST1 values(V_SQL); 
COMMIT; 

END PROC1; 
/

請在您的最後測試。您可以在test1表中看到輸出。

+0

我試圖避免使用動態SQL(它會公平一點複雜我的代碼),但它看起來就像是不可避免的。謝謝你的幫助! – user3639207