PL / SQL:根据结尾选择某个列

时间:2015-10-21 18:31:10

标签: sql plsql

这就是我要做的事。

我需要一个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

1 个答案:

答案 0 :(得分: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;

顺便说一句,我会劝阻你不要这样做。最好有一些元数据告诉你每个表中适当的列是什么,而不是依赖于命名约定。