我有一个自定义查询,我需要知道如何从中提取列名。我已经在寻找任何方法来做到这一点:
这是我尝试测试我的正则表达式的代码:
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是否具有其他正则表达式语法?
您可以解析的发言 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; /