微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

oracle中如何将对象类型的对象作为参数传递

如何解决oracle中如何将对象类型的对象作为参数传递

这是 how to pass object type as a parameter in 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,'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,'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 类型的变量中。

解决方法

您可以像在 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',domain_details_nt
            ( domain_details_ot('abc.com',callback_t
          ( 'www.xyz.com',domain_details_nt
            ( domain_details_ot('xyz.com',domain_ip => '0.0.0.3') ) )
        )
    );
end;

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。