2012-09-04 83 views
5

我需要一个通用方法来在调用过程时获取运行时参数(值)的列表。我需要类似于返回正在运行的过程的名称的$$ PLSQL_UNIT。 (plsql Oracle 10g)oracle plsql:在调用过程时检索运行时参数值

E.g.看看这个示例程序: (它只是输出它自己的名字和参数)

CREATE OR REPLACE PROCEDURE MY_PROC(ow in varchar2, tn IN varchar2) 
IS 

BEGIN 
    dbms_output.put_line('proc_name: '||$$PLSQL_UNIT||' parameters: '|| ow||' '||tn ); 

    EXCEPTION 
    WHEN OTHERS THEN 
     DBMS_OUTPUT.PUT_LINE('ERRORE: ' ||SQLERRM); 

END MY_PROC; 
/

运行程序产生下面的输出:

SQL> 
    1 BEGIN 
    2  IBAD_OWN.MY_PROC('first_par', 'second_par'); 
    3 END; 
    4/

proc_name: MY_PROC parameters: first_par second_par 

PL/SQL procedure successfully completed. 

我不会满足,因为我不能复制和粘贴在我的所有程序中,因为我必须对每个过程进行硬编码以设置其正确的参数变量。

在此先感谢您的帮助。

+1

http://stackoverflow.com/questions/12160928/get-a-parameters-name/的可能重复? – tbone

+0

是的,我认为这是同一个问题。两者都没有答案:(我认为没有办法获得参数的价值:( – tortugone

+1

我不认为这是同一个问题。你要求_value_参数而不知道它的名字。正如指出的那样在一个现在被删除的答案中,并且在链接的问题中,发现参数的名称很容易,但不是该参数的值。 – Ben

回答

2

无法动态检索传递给Oracle PL/SQL中的过程的参数值。这种语言根本不是为了处理这种操作而设计的。

顺便提一下,在位于包中的过程中,$$PLSQL_UNIT只会返回包的名称。我发现最好在每个包含过程名称的过程中定义一致命名的常量。

1

当我需要与您的功能相同的功能时,我没有找到任何好的内置解决方案。

我所做的是:写了修改函数/过程/包的原始主体的DB级触发器。 此触发器在“开始”动态生成的“user_arguments”代码片段后立即添加。

另外,在此之后,我将这个代码包含进这个触发器中,该代码记录发生异常时触发特效的代码。

另外,你可以跟踪procs的调用,以及更多的内部事物。

但是,这种解决方案只适用于预生产,因为性能显着下降。

PS。对不起,我的英语不好。

+0

你能发布你的代码吗? – Jesse