如何获得使用%ROWTYPE参数的PLSQL过程的真实签名?
例如 :
clear screen;
prompt > Table creation to support %ROWTYPE
create table samples (
id number,
code varchar2(15),
lib varchar2(200) );
prompt > Package witch use %ROWTYPE
create or replace package use_samples as
procedure getSample(input_sample samples%ROWTYPE);
end use_samples;
/
prompt > Package BODY witch use %ROWTYPE
create or replace package body use_samples as
procedure getSample(input_sample IN samples%ROWTYPE) is
ex samples%ROWTYPE;
begin
select * into ex from samples where samples.code = input_sample.code;
end getSample;
end use_samples;
/
prompt > Proc arguments by ALL_ARGUMENTS
set pagesize 50000
set linesize 2000
set verify off
CLEAR COLUMNS;
COLUMN object_name HEADING "PROC" FORMAT A30 JUSTIFY LEFT;
COLUMN argument_name HEADING "ARGUMENT_NAME" FORMAT A30 JUSTIFY LEFT;
select object_name, argument_name, in_out, data_level, position, data_type
from all_arguments
where owner = USER
and package_name = 'USE_SAMPLES'
and object_name = 'GETSAMPLE';
prompt >> Argument 'INPUT_SAMPLE' is shown as 'PL/SQL RECORD' without any link to 'samples%ROWTYPE'
prompt > PLSQL types declared
select *
from DBA_PLSQL_TYPES
where owner = USER
and package_name = 'USE_SAMPLES';
prompt >> There is no declared type because we use directly a %ROWTYPE argument
prompt > Clean up
drop package use_samples;
drop table samples;
Run Code Online (Sandbox Code Playgroud)
给出:
> Table creation to support %ROWTYPE
Table SAMPLES created.
> Package witch use %ROWTYPE
Package USE_SAMPLES compiled
> Package BODY witch use %ROWTYPE
Package body USE_SAMPLES compiled
> Proc arguments by ALL_ARGUMENTS
columns cleared
PROC ARGUMENT_NAME IN_OUT DATA_LEVEL POSITION DATA_TYPE
------------------------------ ------------------------------ --------- ---------- ---------- ------------------------------
GETSAMPLE INPUT_SAMPLE IN 0 1 PL/SQL RECORD
GETSAMPLE ID IN 1 1 NUMBER
GETSAMPLE CODE IN 1 2 VARCHAR2
GETSAMPLE LIB IN 1 3 VARCHAR2
>> Argument 'INPUT_SAMPLE' is shown as 'PL/SQL RECORD' without any link to 'samples%ROWTYPE'
> PLSQL types declared
no rows selected
>> There is no declared type because we use directly a %ROWTYPE argument
> Clean up
Package USE_SAMPLES dropped.
Table SAMPLES dropped.
Run Code Online (Sandbox Code Playgroud)
因此,对于ALL_ARGUMENTS,'INPUT_SAMPLE'显示为'PL/SQL RECORD',没有任何指向'samples%ROWTYPE'的链接.并且DBA_PLSQL_TYPES中没有此类型的跟踪.
如何在此表单下获取此过程的声明类型?
GETSAMPLE INPUT_SAMPLE IN SAMPLES%ROWTYPE
Run Code Online (Sandbox Code Playgroud)
我查了字典,什么也没找到。如果没有信息(我不知道),您可以使用以下内容:
SELECT b.object_name,b.argument_name, REGEXP_SUBSTR (UPPER (text),'([^{ ,(;}]+)%ROWTYPE') tadaaa
FROM user_source a
JOIN (SELECT package_name, object_name, argument_name, in_out, data_level, position, data_type
FROM user_arguments x
WHERE data_type = 'PL/SQL RECORD' AND package_name = 'USE_SAMPLES' AND object_name = 'GETSAMPLE' ) b
ON a.name = b.package_name
WHERE a.TYPE = 'PACKAGE BODY'
AND UPPER (text) LIKE '%\%ROWTYPE%' ESCAPE '\'
AND UPPER (text) LIKE '%'||UPPER(ARGUMENT_NAME)||'%'
Run Code Online (Sandbox Code Playgroud)
:) 让正则表达式中的一些专家检查我的正则表达式。实际上参数名称也必须在正则表达式中。