gpt4 book ai didi

oracle - 表变量作为参数填充oracle存储过程中的表

转载 作者:行者123 更新时间:2023-12-01 23:30:57 27 4
gpt4 key购买 nike

大多数情况下,我避免将表变量作为存储过程的输入参数。因为我不知道如何处理它们,但在这种情况下我别无选择。我需要将数百条记录从 Oracle Agile PLM 传递到数据库。我要做的是从输入记录/列表中填充一个表。为了实现这一点,我开发了一个对象类型,然后从该对象类型中开发了一个表类型。

CREATE OR REPLACE TYPE TEST_USER.MD_TYPE AS OBJECT
(QUERY_REF VARCHAR2 (1000 BYTE),
COL_NAME VARCHAR2 (100 BYTE),
COL_LENGTH VARCHAR2 (50 BYTE),
COL_SEQ NUMBER)
/

CREATE OR REPLACE TYPE TEST_USER.MD_TYPE_TABLE AS TABLE OF MD_TYPE
/

存储过程:
CREATE OR REPLACE PROCEDURE SP_TEST2
(
P_MD_TABLE IN MD_TYPE_TABLE,
p_success OUT number
)
IS

BEGIN

INSERT INTO MDATA_TABLE
(
QUERY_REF ,
COL_NAME ,
COL_LENGTH ,
COL_SEQ

)
SELECT ea.*
FROM TABLE(P_MD_TABLE) ea;

p_success :=1;
EXCEPTION
WHEN OTHERS THEN
p_success := -1;
END SP_TEST2;

问题是我不知道如何填充,第一个参数 P_MD_TABLE 然后 MDATA_TABLE。并且程序编译没有任何错误。我没有测试过这个程序。

请任何帮助。

通过将参数传递给 MD_TYPE 加载 MD_TYPE_TABLE 的过程
CREATE OR REPLACE PROCEDURE SP_UPLOAD_MD_TYPE
(
P_QUERY_REF VARCHAR2,
P_COL_NAME VARCHAR2,
P_COL_LENGTH VARCHAR2,
p_col_seq NUMBER,
p_no_of_rows_to_insert NUMBER,
p_num OUT NUMBER
)
IS

p_type_tbl MD_TYPE_TABLE := MD_TYPE_TABLE(); --initialize

BEGIN
<<vartype>>
FOR i IN 1..p_no_of_rows_to_insert
LOOP
p_type_tbl.extend();
p_type_tbl(p_type_tbl.last) := MD_TYPE(P_QUERY_REF, P_COL_NAME, P_COL_LENGTH, p_col_seq);
END LOOP vartype;


SP_TEST2(p_type_tbl, p_num);


END;

最佳答案

您可以填写 table type通过使用 extend/ bulk collect
使用 extend

p_type_tbl.extend();
p_type_tbl(p_type_tbl.last) := MD_TYPE('QUERY_REF1', 'COL_NAME1', 'COL_LENGTH1', 1);

或使用 bulk collect
SELECT MD_TYPE(c1, c2... cn)
BULK COLLECT INTO p_type_tbl
FROM some_table;

演示
DECLARE
p_type_tbl MD_TYPE_TABLE := MD_TYPE_TABLE(); --initialize
p_num NUMBER;
BEGIN
p_type_tbl.extend();
p_type_tbl(p_type_tbl.last) := MD_TYPE('QUERY_REF1', 'COL_NAME1', 'COL_LENGTH1', 1);

p_type_tbl.extend();
p_type_tbl(p_type_tbl.last) := MD_TYPE('QUERY_REF2', 'COL_NAME2', 'COL_LENGTH2', 2);

SP_TEST2(p_type_tbl, p_num);

DBMS_OUTPUT.PUT_LINE(p_num);
END;
/

输出
1
SELECT * FROM MDATA_TABLE;

输出
QUERY_REF   COL_NAME    COL_LENGTH  COL_SEQ
QUERY_REF1 COL_NAME1 COL_LENGTH1 1
QUERY_REF2 COL_NAME2 COL_LENGTH2 2

关于oracle - 表变量作为参数填充oracle存储过程中的表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36028833/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com