plPL/SQL:根据列的结尾选择列

  • 本文关键字:结尾 选择 SQL plPL sql plsql
  • 更新时间 :
  • 英文 :


这是我想要做的。

我需要一个进程,它将接受一个IN参数,这是一个表名和一个ref游标只有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

为什么要在列中查找表名呢?一个表是否真的有多个以"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;
顺便说一句,我不建议你采用这种设计。最好有某种类型的元数据告诉您每个表中合适的列是什么,而不是依赖于命名约定。

最新更新