小编典典

PL / SQL从自定义查询中提取SELECT语句列名称

sql

我有一个自定义查询,我需要知道如何从中提取列名。我已经在寻找任何方法来做到这一点:

  • 正则表达式:我已经构建了这个程序,以或多或少地获得我想要的东西,但是它不起作用(我使用的是Toad 12.6.0.53)。

这是我尝试测试我的正则表达式的代码:

DECLARE
  v_SQL VARCHAR2(32767 CHAR);
  v_Result VARCHAR2(32767 CHAR);
BEGIN 
  v_SQL := 'SELECT 
  ALIASBASE.CDCMPANY, 
  ALIASBASE.PAFCODCTR, 
  ALIASBASE.PAFDTSCAD, 
  NUMFLUSSO.NUMERO, 
  ALIASBASE.PAFDESC, 
  ALIASBASE.PAFTYPE, 
  ALIASBASE.PAFNATURE, 
  ALIASBASE.PAFRECEIV, 
  ALIASBASE.PAFCAUSAL, 
  ALIASBASE.PAFCODDNE, 
  ALIASBASE.PAFMATURITY
  FROM ALBSIAE';

  BEGIN
    SELECT 
      REGEXP_SUBSTR (v_SQL, '(?:\s*(?=\w+\.|.*as\s+|)(\*|\w+)(?=\s*(?=,|from)))',1, NULL,'i') REGEX_RESULT 
    INTO
      v_Result
    FROM DUAL;
  END;

  DBMS_OUTPUT.put_line('v_Result: ' || v_Result);
END;

但是最后,v_Result为空。

  • 另一种方法是在我的表列之间循环,正如我在这里所看到的,但我认为情况并非如此。

因此,我想知道是否还有其他方法可以执行此操作,我对正则表达式是否有错?里面有什么问题吗?Oracle是否具有其他正则表达式语法?


阅读 199

收藏
2021-04-28

共1个答案

小编典典

您可以解析的发言 DBMS_SQL.PARSE ,并获得与列 DBMS_SQL.describe_columns

DECLARE
  v_SQL VARCHAR2(32767 CHAR);
  v_Result VARCHAR2(32767 CHAR) := '';
  l_cursor        PLS_INTEGER;
  l_col_cnt       PLS_INTEGER;
  i               PLS_INTEGER;
  l_desc_tab      DBMS_SQL.desc_tab;
BEGIN 
  v_SQL := q'[SELECT 1 as "MY_NUMBER", 'z' as "MY_CHAR" from dual]';
  l_cursor := DBMS_SQL.open_cursor;
  DBMS_SQL.parse(l_cursor, v_SQL, DBMS_SQL.native);
  DBMS_SQL.describe_columns(l_cursor, l_col_cnt, l_desc_tab);

  FOR i IN 1 .. l_col_cnt LOOP
    v_Result := v_Result ||' ' || l_desc_tab(i).col_name;
  END LOOP;

  DBMS_OUTPUT.put_line('v_Result: ' || v_Result);

END;
/
2021-04-28