Как передать объект типа объекта в качестве параметра в оракуле
Это вопрос следующего уровня о том, как передать тип объекта в качестве параметра в oracle .
Мой вопрос в том же контексте немного глубже с отношением вложенного уровня мастер-потомок, который является объектом в объекте. И я не нашел способа вызвать такую процедуру из PL-SQL.
Давайте изменим пример, приведенный в приведенном выше вопросе, как показано ниже:
Создание объектов и типов:
CREATE OR REPLACE TYPE domain_details_ot AS OBJECT
(
domain_name VARCHAR2(50),
domain_ip VARCHAR2(50)
);
CREATE OR REPLACE TYPE domain_details_nt AS TABLE OF domain_details_ot;
CREATE OR REPLACE TYPE CALLBACK_T AS OBJECT
(
url VARCHAR2(50),
uri_key NUMBER,
domains domain_details_nt
);
CREATE OR REPLACE TYPE callbck AS TABLE OF callback_t;
Создайте и вставьте утверждения для требования:
CREATE TABLE url_hdr
(url_hdr_id INT
, url VARCHAR2(100)
, url_key NUMBER
, CONSTRAINT url_hdr_pk PRIMARY KEY (url_hdr_id)
);
CREATE TABLE url_dtl
(url_dtl_id INT
, url_hdr_id INT
, domain_name VARCHAR2(500)
, domain_ip VARCHAR2(50)
, CONSTRAINT url_dtl_pk PRIMARY KEY (url_dtl_id)
, CONSTRAINT url_dtl_fk1 FOREIGN KEY (url_hdr_id) REFERENCES url_hdr(url_hdr_id)
);
INSERT INTO url_hdr VALUES (1, 'www.abc.com', 12345);
INSERT INTO url_hdr VALUES (2, 'www.xyz.com',23456);
INSERT INTO url_dtl VALUES (1, 1, 'abc.com', '0.0.0.0');
INSERT INTO url_dtl VALUES (2, 1, 'def.com', '0.0.0.1');
INSERT INTO url_dtl VALUES (3, 2, 'uvw.com', '0.0.0.2');
INSERT INTO url_dtl VALUES (4, 2, 'xyz.com', '0.0.0.3');
COMMIT;
SELECT uh.url, uh.url_key, ud.domain_name, ud.domain_ip
FROM url_hdr uh
,url_dtl ud
WHERE uh.url_hdr_id = ud.url_hdr_id
AND uh.url_hdr_id IN (1,2);
Пример кода процедуры:
CREATE OR REPLACE PROCEDURE get_callback_info(
pi_clbk IN callbck := callbck()
)
IS
BEGIN
FOR i IN 1..pi_clbk.COUNT
LOOP
dbms_output.put_line('i : '||i ||' '||pi_clbk(i).url);
FOR j IN 1..pi_clbk(i).domains.COUNT
LOOP
dbms_output.put_line('i : '||i || ' j : '||j ||' '||pi_clbk(i).uri_key);
dbms_output.put_line('i : '||i || ' j : '||j ||' '||pi_clbk(i).domains(j).domain_name);
dbms_output.put_line('i : '||i || ' j : '||j ||' '||pi_clbk(i).domains(j).domain_ip);
END LOOP;
END LOOP;
END;
/
Поскольку это вызывается из кода Java, и там они могут создать объект с помощью объекта. Мне не нужно вызывать это со стороны PL-SQL, и я спасен.
Теперь мой вопрос: как вызвать такую процедуру из PL-SQL? Я хочу вызвать эту процедуру для записей, возвращаемых оператором Select. В основном мне нужно хранить эти значения в переменной типа callbck.
1 ответ
Вы создаете экземпляр объекта так же, как и в SQL, например:
select callbck
( callback_t
( 'www.abc.com'
, 12345
, domain_details_nt
( domain_details_ot('abc.com', domain_ip => '0.0.0.0')
, domain_details_ot('xyz.com', domain_ip => '0.0.0.1') ) )
, callback_t
( 'www.xyz.com'
, 23456
, domain_details_nt
( domain_details_ot('xyz.com', domain_ip => '0.0.0.2')
, domain_details_ot('abc.com', domain_ip => '0.0.0.3') ) )
)
from dual;
Итак, чтобы вызвать процедуру, это будет что-то вроде
begin
get_callback_info(
callbck
( callback_t
( 'www.abc.com'
, 12345
, domain_details_nt
( domain_details_ot('abc.com', domain_ip => '0.0.0.0')
, domain_details_ot('xyz.com', domain_ip => '0.0.0.1') ) )
, callback_t
( 'www.xyz.com'
, 23456
, domain_details_nt
( domain_details_ot('xyz.com', domain_ip => '0.0.0.2')
, domain_details_ot('abc.com', domain_ip => '0.0.0.3') ) )
)
);
end;