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

Posted

技术标签:

【中文标题】如何在oracle中将对象类型的对象作为参数传递【英文标题】:How to pass object of object type as a parameter in oracle 【发布时间】:2021-01-22 14:43:58 【问题描述】:

这是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, 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 代码中调用的,因此他们可以使用 in 对象创建对象。我不需要从 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;

【讨论】:

非常感谢。它按预期工作。我脑子里还有一件事,这里传递的值是硬编码的。现在,如果我需要从表中选取值,如何调用此过程,将它们存储在 callbck 类型的变量中,然后在函数中使用该变量。如果它不是嵌套的,我可以使用参考问题答案中给出的批量收集。我们这里也可以这样吗? 当然,您可以拥有一个callbck 类型的PL/SQL 变量并将其传递给过程。 威尔,请你告诉我,我该怎么做。我已经编辑了原始问题以包含表的插入语句。这里我需要为这些记录调用这个过程,其中 url_hdr_id IN (1,2)。声明 lv_callbck callbck; BEGIN 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') ) ) ) INTO lv_callbck from dual;结尾;我们可以使用表格从 select stmt 中获得它吗?

以上是关于如何在oracle中将对象类型的对象作为参数传递的主要内容,如果未能解决你的问题,请参考以下文章

如何在Java中将对象数组作为参数传递

如何在Javascript中将对象作为参数传递

在corda shell中将状态对象作为参数传递

如何在谷歌应用引擎 RPC 流中将对象作为参数传递?

如何在 WCF Rest Service 中将类对象作为参数传递

在 Postman 中将类对象作为参数传递