PL/SQL:根据某些列的结尾选择它们

PL/SQL:根据某些列的结尾选择它们,sql,plsql,Sql,Plsql,这是我想要做的 我需要一个proc,它将接受一个作为表名的inparam和一个只有3列的ref游标 我想要的列是以_NAME_EN、NAME_FR和_ID结尾的列 我尝试过类似的方法,但有时措辞与表名不匹配 procedure getcodetable(p_table in varchar2, p_refcursor out cur) is query_str varchar2(1000); substr_table varchar2(200); someta

这是我想要做的

我需要一个proc,它将接受一个作为表名的inparam和一个只有3列的ref游标

我想要的列是以_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\u-SOME\u-TYPE,而我要查找的列的名称是SOME\u-TYPE\u-EN。但有时,它更像是一些_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\u 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;

顺便说一句,我不鼓励你采用这种设计。最好使用某种元数据来告诉您每个表中的相应列,而不是依赖命名约定。

我在l_name_en_col_name上得到了一个“缺少的关键字”,我是在给您提供一种方法,而不是为您编写整个内容。您需要在PL/SQL块中将l\u name\u en\u col\u name声明为
VARCHAR2(30)
。然后仔细检查所有语法。