Как просмотреть тип переменной в PL / SQL?
есть ли функция в PL / SQL, чтобы показать точный тип переменной, как функция дампа в SQL?
Я пробовал следующее
DECLARE
l_variable INTEGER := 1;
BEGIN
DBMS_OUTPUT.PUT_LINE (DUMP (l_variable));
END;
но он дает следующую ошибку:
PLS-00204: функция или псевдо - столбец "дамп" могут использоваться внутри SQL только заявление
3 ответов
Вы можете создать эту функцию с помощью PL / Scope. Но он не будет работать с анонимными блоками, и вам нужно будет ссылаться на переменную как на строку.
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;
/
NUMBER
INTEGER
MY_WEIRD_TYPE
MY_SUBTYPE
Как вы должны заметить, дамп является перегруженной функцией. он имеет 3 перегрузки.
Так что вы можете имитировать то же самое в коде.
function myDump (x Varchar2) return varchar2 is begin return('string') ; end ;
function myDump (x number) return varchar2 is begin return('integer') ; end ;
function myDump (x date) return varchar2 is begin return('date') ; end ;
приведенный выше код может работать неправильно, но должно дать вам представление о том, как решать проблему.
Я надеюсь, что это будет соответствовать вашим требованиям.
Примечание; Вы можете поместить эти функции в пакете и использовать их соответственно.
declare
a number(10,3);
type_info varchar2(400);
begin
a := 55.5;
select dump(a) into type_info from dual;
DBMS_OUTPUT.PUT_LINE(type_info);
end;