2015-10-21 8 views
0

以下是我期待做的事情。PL/SQL:根據他們的結局選擇某個列

我需要一個proc,它將採用一個表名稱的IN參數,並且OUT一個只有3列的參考光標。

我想要的列是那些以_NAME_EN,NAME_FR和_ID結尾的列。

我嘗試了這樣的事情,但有時措辭與表名不匹配。

procedure getcodetable(p_table in varchar2, p_refcursor out cur) is  

query_str   varchar2(1000); 
substr_table varchar2(200); 
sometable   varchar2(200); 

begin 

    substr_table := substr(upper(p_table), 4); -- this should remove the CD_ 
    sometable := trim(trailing 'S' from substr_table); -- this should remove the S at the end 

    query_str := 'select ' || sometable || '_id as id, ' || sometable || '_name_en as name_en, ' || sometable || '_name_fr as name_fr from ' || p_table; 

    open p_refcursor for query_str; 

end getcodetable; 

例如,大多數表的名字將是CD_SOME_TYPES和我在尋找SOME_TYPE_NAME_EN列。但有時,更像SOME_TP_NAME_EN

回答

0

爲什麼在列中查找表名呢?一張桌子是否真的有多欄以「NAME_EN」或「NAME_FR」結尾,你必須有邏輯能夠從中選擇?如果沒有,您可以簡單地:

SELECT column_name 
INTO l_name_en_col_name 
FROM dba_tab_columns 
WHERE table_name = p_table_name 
AND column_name LIKE '%_NAME_EN' ESCAPE '\'; 

...您的ID和NAME_FR列有類似的聲明。然後...

query_str := 'select ' || l_id_col_name || ' as id, ' || l_name_en_col_name || ' as name_en, ' || l_name_fr_col_name || ' as name_fr from ' || p_table; 

順便說一句,我會勸阻你從這個設計。最好有一些元數據告訴你每個表中適當的列,而不是依賴命名約定。

+0

我在l_name_en_col_name – Karinne

+0

處得到一個「缺少的關鍵字」我給了你一個方法,而不是爲你寫整個東西。您需要在PL/SQL塊中聲明l_name_en_col_name爲'VARCHAR2(30)'。然後仔細檢查所有語法。 –