2013-06-12 94 views
1

有沒有什麼辦法只獲取在存儲過程的select語句中使用的別名?我想用這個select語句創建實體。在Oracle中獲取別名名稱存儲過程

例子:

procedure Getnames(namerecords out Sys_refcursors) 
as 
begin 
open namerecords for 
select 
    N.First_name FirstName, 
    N.SecondName Secondname 
from Names 
End Getnames; 

我想只有通過存儲過程的名稱只得到了Firstnamesecondname結果。

是否有任何系統表存儲此信息?

+1

該查詢的結果只會給你'FirstName'和'Secondname',你期待什麼?另外,你還沒有使用'P_nameId'參數。而且,你的查詢將失敗,因爲你沒有在from子句中應用別名'N'。 –

+0

沒有運行此Sp我想要從任何SYS表中獲取別名。如果我有一個包中有超過20個SP,我希望通過只傳遞存儲此信息的任何SYS表中的SP名稱來獲取所有別名。 – 7783

+0

除了查詢它們時,sys表沒有「別名」。我想我並不真正瞭解你想要用這個程序做什麼。 –

回答

0

我想答案是 select * from all_source where name='YOUR_SP'

但是你應該做一些文本處理來找到別名,並且程序應該有相同的格式。

1
CREATE OR REPLACE PROCEDURE dummy_proc 
AS 
    CURSOR dummy_cur is 
     SELECT dummy AS dummy_alias1, dummy AS dummy_alias2,dummy dummy_alias3 
     ,  dummy AS dummy_alias4 
     , dummy dummy_alias5 
     ,dummy dummy_alias6 
     ,dummy dummy_alias7 
     FROM DUAL; 
BEGIN 
    NULL; 
END; 
-- PROCEDURE DUMMY_PROC compiled 

WITH all_src AS 
(
     SELECT owner, name, type, line, text 
     FROM all_source 
     WHERE owner = USER 
     AND  type = 'PROCEDURE' 
     AND  name = 'DUMMY_PROC' 
) 
, conditions AS 
(
     SELECT line AS con_start 
     ,  LEAD(line) OVER (PARTITION BY name ORDER BY line) AS con_end 
     FROM all_src 
     WHERE (INSTR(UPPER(text), 'SELECT') > 0 OR INSTR(UPPER(text), 'FROM') > 0) 
) 
, one_line AS 
(
     SELECT LISTAGG(text, ' ') WITHIN GROUP (ORDER BY line) AS select_line 
     FROM all_src 
     WHERE EXISTS 
       (
        SELECT 1 
        FROM conditions 
        WHERE line >= con_start 
        AND  line < con_end 
       ) 
) 
SELECT REGEXP_REPLACE 
     (
      REGEXP_SUBSTR(select_line, '\w+(\s+\,|\,|$)', 1, 1) || ' ' || 
      REGEXP_SUBSTR(select_line, '\w+(\s+\,|\,|$)', 1, 2) || ' ' || 
      REGEXP_SUBSTR(select_line, '\w+(\s+\,|\,|$)', 1, 3) || ' ' || 
      REGEXP_SUBSTR(select_line, '\w+(\s+\,|\,|$)', 1, 4) || ' ' || 
      REGEXP_SUBSTR(select_line, '\w+(\s+\,|\,|$)', 1, 5) || ' ' || 
      REGEXP_SUBSTR(select_line, '\w+(\s+\,|\,|$)', 1, 6) || ' ' || 
      REGEXP_SUBSTR(select_line, '\w+(\s+\,|\,|$)', 1, 7) 
     -- REGEXP_SUBSTR(select_line, '\w+(\s+\,|\,|$)', 1, 8) 
     -- REGEXP_SUBSTR(select_line, '\w+(\s+\,|\,|$)', 1, 9) 
     , '\s+\,\s+' 
     , ', ' 
     ) AS r_substr 
FROM one_line 
; 

-- dummy_alias1, dummy_alias2, dummy_alias3, dummy_alias4, dummy_alias5, dummy_alias6, dummy_alias7 
+0

+1在這種情況下,這可能已經足夠好了。但解析SQL很少100%準確。例如,「dummy + 1 as dummy_alias8」將不起作用。 –

+0

在Oracle中,不建議使用加號。你可以使用它的引號。我知道在SQL Server或MySQL中通常使用「[]」或「''」,但不能在Oracle中使用。 –

+0

對不起,我的例子不明確。我應該使用代碼格式而不是引號。我的意思是,如果你使用表達式而不是列,代碼將無法工作。例如,「dummy + 1 as dummy_alias8」。 –