我使用 ALL_ARGUMENTS 来获取 oracle 10g 中的参数列表,但我找不到参数的默认值。我该怎么办?
问问题
1165 次
3 回答
0
您可能需要按照下面的代码示例在 10g 中使用 plsql 编程。这个解决方案在某种意义上肯定是蛮力的,因为您基本上使用非常低级的原语编写函数/过程声明解析器的一部分。但是,正则表达式函数在 10g 中也不可用...
代码的要点是:
- 遍历过程/函数声明的源代码行
- 注意最近声明的例程的名称
- 分析包含关键字'DEFAULT'的所有行,获取参数名称和默认值规范(代码示例中没有详细概述)。
谨防陷阱:
- 多行声明
- 包含 C 样式注释开头字符串的 C 样式注释 ( a la / * blah blah /胡说八道 * */ )
- 包含关键字的字符串文字
希望无论如何都有帮助,最好的问候。
编码:
DECLARE
l_arg_and_more VARCHAR2(400);
l_current_unit VARCHAR2(400);
l_default_spec VARCHAR2(400);
l_offset_default BINARY_INTEGER;
l_offset_eoname BINARY_INTEGER;
BEGIN
FOR i IN (
select text
from all_source
where owner = '<name of owner>'
and name = '<object name>'
and type in ( 'PACKAGE', 'PROCEDURE', 'FUNCTION')
and text not like '--%'
order by line
) LOOP
IF i.text LIKE '%FUNCTION%' OR i.text LIKE '%PROCEDURE%' THEN
IF i.text LIKE '%FUNCTION%' THEN
l_current_unit := LTRIM(SUBSTR(i.text, INSTR(i.text, 'FUNCTION') + LENGTH('FUNCTION')), ' ');
l_offset_eoname := INSTR(l_current_unit, ' ');
IF l_offset_eoname = 0 OR l_offset_eoname > INSTR(l_current_unit, '(') THEN
l_offset_eoname := INSTR(l_current_unit, '(');
END IF;
IF l_offset_eoname <> 0 THEN
l_current_unit := SUBSTR(l_current_unit, 1, l_offset_eoname-1);
ELSE
l_current_unit := 'unidentified';
END IF;
END IF;
END IF;
--
IF i.text LIKE '%DEFAULT%' THEN
l_offset_default := INSTR (i.text, 'DEFAULT');
l_arg_and_more := SUBSTR(i.text, 1, l_offset_default - 1);
l_default_spec := SUBSTR(i.text, l_offset_default + LENGTH('DEFAULT') + 1);
--
-- process l_arg_and_more to get the arg name, l_default_spec for the default value
--
END IF;
END LOOP;
END;
于 2013-01-15T18:21:30.843 回答
0
我知道这有点太晚了,但这可能会有所帮助。我现在面临着类似的问题。需要更多测试...
SELECT SUBSTR(final_str, start_pos+1, (end_pos-start_pos-1) ) dflt_values, start_pos, end_pos
FROM
(
SELECT start_pos, final_end_pos end_pos, MOD(ROWNUM, 2) rno, final_str FROM
(
SELECT distinct start_pos, end_pos, final_str, (CASE WHEN end_pos < start_pos THEN (start_pos*2) ELSE end_pos END) final_end_pos
FROM
(
SELECT Instr(final_str, '=', LEVEL) start_pos, Instr(final_str, ',', LEVEL) end_pos, final_str --<<-- distinct
FROM
(
SELECT RTRIM(SUBSTR(str, 1, e_start), ',')||RTRIM(SUBSTR(str, e_start, e_end-e_start), ')') final_str
, e_start
, e_end
, e_end-e_start
FROM
(
SELECT str, Instr(str, ',', 1, 5) e_start, Instr(str, ')') e_end
FROM
(
SELECT REPLACE(REPLACE(REPLACE(SUBSTR(str, INSTR(str, '(')+1), chr(32), ''), chr(10), chr(32) ), 'DEFAULT', ':=') str
FROM
(
SELECT 'PROCEDURE Some_Proc(p_arg1 VARCHAR2:= ''Arg1''
, p_arg2 VARCHAR2:= ''Arg2''
, p_arg3 DATE DEFAULT ''SYSDATE-90''
, p_arg4 VARCHAR2 DEFAULT ''NULL''
, p_arg5 NUMBER := ''10'')' str
FROM dual
))))
CONNECT BY LEVEL <= LENGTH(final_str)
)
WHERE start_pos > 0
ORDER BY start_pos, end_pos
))
WHERE rno > 0
/
于 2013-11-04T21:59:12.523 回答
0
在视图SYS.ALL_ARGUMENTS
中有一个名为 的列DEFAULT_VALUE
,但即使在 11g 中,它的类型也是LONG
令人头疼的解决方法并将其转换为 CLOB。
“最简单”(不是最好)的方法是从此视图创建一个表,TO_LOB
用于将此字段转换为 aCLOB
并使用它。
于 2015-07-01T14:26:56.827 回答