このリンクは、プロシージャ/関数変数の型をOracleで取得する方法を示しています(View Type of a variable)。PL/SQLで変数のタイプを動的に表示するにはどうすればいいですか?
それはとてもスルー機能「get_plsql_type_name」を行います。上記の方法で問題は、それが静的であり、私は1つのサブタイプであることができ、変数のタイプを確認する必要があるということです
create or replace function get_plsql_type_name
(
p_object_name varchar2,
p_name varchar2
) return varchar2 is
v_type_name varchar2(4000);
begin
select reference.name into v_type_name
from user_identifiers declaration
join user_identifiers reference
on declaration.usage_id = reference.usage_context_id
and declaration.object_name = reference.object_name
where
declaration.object_name = p_object_name
and declaration.usage = 'DECLARATION'
and reference.usage = 'REFERENCE'
and declaration.name = p_name;
return v_type_name;
end;
/
alter session set plscope_settings = 'IDENTIFIERS:ALL';
create or replace type my_weird_type is object
(
a number
);
create or replace procedure test_procedure is
var1 number;
var2 integer;
var3 my_weird_type;
subtype my_subtype is pls_integer range 42 .. 43;
var4 my_subtype;
begin
dbms_output.put_line(get_plsql_type_name('TEST_PROCEDURE', 'VAR1'));
dbms_output.put_line(get_plsql_type_name('TEST_PROCEDURE', 'VAR2'));
dbms_output.put_line(get_plsql_type_name('TEST_PROCEDURE', 'VAR3'));
dbms_output.put_line(get_plsql_type_name('TEST_PROCEDURE', 'VAR4'));
end;
/
begin
test_procedure;
end;
/
を手続き/関数のスコープで宣言されています。
上記の方法を使用すると、次のようになります。
Create the type and its subtype:
create or replace type my_weird_type is object
(
a number
) NOT FINAL;
CREATE OR REPLACE TYPE my_weird_subtype UNDER my_weird_type(
b number
);
/
テーブルを作成し、それを移入:
create table test_my_weird_type(
x my_weird_type,
y my_weird_subtype
);
INSERT INTO test_my_weird_type (x,y) VALUES (my_weird_type(100),my_weird_subtype(100,200));
COMMIT;
関数の作成(それが2つのmy_weird_typeパラメータがあり、時々私はそのサブタイプを使用する必要がつもりです):
create or replace function test_procedure (
inn_type my_weird_type,
out_subtype my_weird_type
) RETURN number is
var1 number;
var2 integer;
begin
dbms_output.put_line(get_plsql_type_name('TEST_PROCEDURE', 'VAR1'));
dbms_output.put_line(get_plsql_type_name('TEST_PROCEDURE', 'VAR2'));
dbms_output.put_line(get_plsql_type_name('TEST_PROCEDURE', 'INN_TYPE'));
dbms_output.put_line(get_plsql_type_name('TEST_PROCEDURE', 'OUT_SUBTYPE'));
return 1;
end;
/
ベロウクエリ:
select test_procedure(x,y) from test_my_weird_type;
は、以下の出力を与える:
NUMBER
INTEGER
MY_WEIRD_TYPE
MY_WEIRD_TYPE
しかし、右出力される。
NUMBER
INTEGER
MY_WEIRD_TYPE
MY_WEIRD_SUBTYPE
関数はWICHサブタイプを認識する必要が使用されるbeeingており、従って 関数「get_plsql_type_name」は改善する必要があります。それを行う方法はありますか?
ありがとうございます。
Ok ...ユーザーが渡したオブジェクト型を取得できない場合は、その属性を操作するためにその属性をどのように知ることができますか? – Siqueira
'ユーザが渡したオブジェクト型を取得できない場合、その属性をどのように知ってそれを操作することができますか? - それを操作することはできません。 – XING