2016-04-14 55 views
6

Cách lấy chữ ký thực cho quy trình PLSQL sử dụng các đối số% ROWTYPE?Cách nhận chữ ký thực bằng% ROWTYPE

Ví dụ:

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; 

cho:

> 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. 

Vì vậy, với ALL_ARGUMENTS, 'INPUT_SAMPLE' được hiển thị như 'PL/SQL RECORD' mà không cần bất kỳ liên kết để 'mẫu ROWTYPE%'. Và không có dấu vết nào của loại này trong DBA_PLSQL_TYPES.

Tôi làm cách nào để nhận loại khai báo của quy trình này theo biểu mẫu này?

GETSAMPLE INPUT_SAMPLE IN SAMPLES%ROWTYPE 

Trả lời

0

Tôi đã tìm kiếm trong từ điển và không tìm thấy gì. Nếu không có thông tin (tôi không biết), bạn có thể sử dụng thông tin như:

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)||'%'  

:) Hãy để một số guru kiểm tra biểu thức regex của tôi. Trên thực tế, tên đối số cũng phải nằm trong regex.

+0

tôi giả sử, ý tưởng này sẽ hoạt động nếu tất cả các gói sẽ hoạt động theo kiểu bê tông. Trong trường hợp khác, chúng tôi không thể hỗ trợ tất cả các tùy chọn có thể –

+0

Tôi sẽ không đặt nó thực sự là câu trả lời, nhưng mã trông khủng khiếp trong các nhận xét. – Mottor

+0

Điều này thực sự chỉ làm việc cho các trường hợp sử dụng đơn giản nhất. Ví dụ. 1) toán tử '% ROWTYPE' có thể được đặt trên một dòng mới, 2) bảng có thể là một từ đồng nghĩa/đủ điều kiện từ lược đồ khác, 3)'% ROWTYPE' có thể là một loại 'RECORD' lồng nhau trong một' RECORD khác ', v.v. –

0

tôi có thể đề nghị để đi theo chiều ngược lại:

1) tạo ra loại đối tượng với tất cả các thuộc tính bạn cần trong bảng của bạn

2) tạo bảng đối tượng của TYPE bạn

3) vượt qua tranh cãi vào bạn thủ tục lOẠI bạn

4) bạn có thể nhận được loại tên từ all_arguments

%rowtype%type là các loại giả được giải quyết động trong quá trình biên dịch. Vì vậy, những gì bạn sẽ mong đợi để xem trong data_dictionary thông tin trong trường hợp này? Không có bản ghi/loại/đối tượng được đặt tên có liên quan đến mẫu% rowtype.

+0

Không liên quan trực tiếp đến câu trả lời này, nhưng hãy kiểm tra URL trên tiểu sử của bạn. Có vẻ như trang web đó đang bị tấn công. Tôi được chuyển tiếp đến các trang web spam khi tôi truy cập trang web đó. –

Các vấn đề liên quan