如何创建一个带有数组参数的oracle存储过程
How to create an oracle stored procedure with an array parameter
我将一个 Oracle 存储过程创建到一个包中。我喜欢这样:
CREATE OR REPLACE PACKAGE PACKFACE IS
TYPE LIST_IDS IS TABLE OF INT INDEX BY BINARY_INTEGER;
PROCEDURE P_SELECT_IDBFRIENDS (CONSULTA OUT SYS_REFCURSOR,COD_US IN INT,IDS_NOT IN LIST_IDS);
END;
包裹的主体是:
CREATE OR REPLACE PACKAGE BODY PACKFACE IS
PROCEDURE P_SELECT_IDBFRIENDS (CONSULTA OUT SYS_REFCURSOR,COD_US IN INT, IDS_NOT IN LIST_IDS) IS
BEGIN
OPEN CONSULTA FOR
SELECT ID_US1,ID_US2 FROM T_FRIENDSHIP WHERE ID_US1=COD_US AND ID_US2 NOT IN (SELECT COLUMN_VALUE FROM TABLE(IDS_NOT));
END;
END;
/
这些在我的 Oracle 12c 服务器中没问题,但我在 Oracle 11g 中执行相同的代码时出现错误,无法访问来自非嵌套 table 项目的行。解决方案是什么?提前致谢
这个问题解决后。似乎另一个我的 Python 代码被破坏了。我有这个程序:
def select_ids(self,cod_us,ids_not):
lista = []
try:
cursor = self.__cursor.var(cx_Oracle.CURSOR)
varray = self.__cursor.arrayvar(cx_Oracle.NUMBER,ids_not)
l_query = self.__cursor.callproc("PROC_SELECT_IDS_ENT_AMISTADES", [cursor, cod_us, varray])
lista = l_query[0]
return lista
except cx_Oracle.DatabaseError as ex:
error, = ex.args
print(error.message)
return lista
PLS-00306 过程调用中参数的数量或类型错误。使用 Oracle 12c 没问题。再次提前致谢。
您不能在 Oracle 11 的 SQL 查询中使用 PL/SQL 中定义的集合类型。
如果您想在 SQL 和 PL/SQL 中使用一个集合,那么您必须在 SQL:
中定义它
CREATE TYPE LIST_IDS IS TABLE OF INT;
那么你可以这样做:
CREATE OR REPLACE PACKAGE PACKFACE IS
PROCEDURE P_SELECT_IDBFRIENDS (
CONSULTA OUT SYS_REFCURSOR,
COD_US IN INT,
IDS_NOT IN LIST_IDS
);
END;
/
SHOW ERRORS;
CREATE OR REPLACE PACKAGE BODY PACKFACE IS
PROCEDURE P_SELECT_IDBFRIENDS (
CONSULTA OUT SYS_REFCURSOR,
COD_US IN INT,
IDS_NOT IN LIST_IDS
)
IS
BEGIN
OPEN CONSULTA FOR
SELECT ID_US1,ID_US2
FROM T_FRIENDSHIP
WHERE ID_US1=COD_US
AND ID_US2 NOT MEMBER OF IDS_NOT;
END;
END;
/
SHOW ERRORS;
首先你应该像这样创建一个 oracle 类型:
CREATE OR REPLACE TYPE LIST_IDS AS TABLE OF INT;
然后您应该使用过程和嵌套的 table 参数创建包,如下所示:
CREATE OR REPLACE PACKAGE PACKFACE IS
TYPE LISTADO_IDS IS TABLE OF INT INDEX BY PLS_INTEGER;
PROCEDURE P_SELECT_IDBFRIENDS (CONSULTA OUT SYS_REFCURSOR,COD_US IN INT,IDS_NOT IN LISTADO_IDS);
END;
最后你应该创建正文。您将数据从 oracle 类型传递到嵌套 table,如下所示:
CREATE OR REPLACE PACKAGE BODY PACKFACE IS
PROCEDURE P_SELECT_IDBFRIENDS (CONSULTA OUT SYS_REFCURSOR,COD_US IN INT, IDS_NOT IN LISTADO_IDS)
IS
num_array FACEBOOK.LIST_IDS;
BEGIN
num_array:=LIST_IDS();
for i in 1 .. IDS_NOT.count
loop
num_array.extend(1);
num_array(i) := IDS_NOT(i);
end loop;
OPEN CONSULTA FOR
SELECT ID_US1,ID_US2 FROM T_FRIENDSHIP WHERE ID_US1=COD_US AND ID_US2 NOT IN (SELECT COLUMN_VALUE FROM TABLE(num_array));
END;
END;
我做到了,并且得到了 python 错误数字或类型参数错误的解决方案。祝你好运。
我将一个 Oracle 存储过程创建到一个包中。我喜欢这样:
CREATE OR REPLACE PACKAGE PACKFACE IS
TYPE LIST_IDS IS TABLE OF INT INDEX BY BINARY_INTEGER;
PROCEDURE P_SELECT_IDBFRIENDS (CONSULTA OUT SYS_REFCURSOR,COD_US IN INT,IDS_NOT IN LIST_IDS);
END;
包裹的主体是:
CREATE OR REPLACE PACKAGE BODY PACKFACE IS
PROCEDURE P_SELECT_IDBFRIENDS (CONSULTA OUT SYS_REFCURSOR,COD_US IN INT, IDS_NOT IN LIST_IDS) IS
BEGIN
OPEN CONSULTA FOR
SELECT ID_US1,ID_US2 FROM T_FRIENDSHIP WHERE ID_US1=COD_US AND ID_US2 NOT IN (SELECT COLUMN_VALUE FROM TABLE(IDS_NOT));
END;
END;
/
这些在我的 Oracle 12c 服务器中没问题,但我在 Oracle 11g 中执行相同的代码时出现错误,无法访问来自非嵌套 table 项目的行。解决方案是什么?提前致谢 这个问题解决后。似乎另一个我的 Python 代码被破坏了。我有这个程序:
def select_ids(self,cod_us,ids_not):
lista = []
try:
cursor = self.__cursor.var(cx_Oracle.CURSOR)
varray = self.__cursor.arrayvar(cx_Oracle.NUMBER,ids_not)
l_query = self.__cursor.callproc("PROC_SELECT_IDS_ENT_AMISTADES", [cursor, cod_us, varray])
lista = l_query[0]
return lista
except cx_Oracle.DatabaseError as ex:
error, = ex.args
print(error.message)
return lista
PLS-00306 过程调用中参数的数量或类型错误。使用 Oracle 12c 没问题。再次提前致谢。
您不能在 Oracle 11 的 SQL 查询中使用 PL/SQL 中定义的集合类型。
如果您想在 SQL 和 PL/SQL 中使用一个集合,那么您必须在 SQL:
中定义它CREATE TYPE LIST_IDS IS TABLE OF INT;
那么你可以这样做:
CREATE OR REPLACE PACKAGE PACKFACE IS
PROCEDURE P_SELECT_IDBFRIENDS (
CONSULTA OUT SYS_REFCURSOR,
COD_US IN INT,
IDS_NOT IN LIST_IDS
);
END;
/
SHOW ERRORS;
CREATE OR REPLACE PACKAGE BODY PACKFACE IS
PROCEDURE P_SELECT_IDBFRIENDS (
CONSULTA OUT SYS_REFCURSOR,
COD_US IN INT,
IDS_NOT IN LIST_IDS
)
IS
BEGIN
OPEN CONSULTA FOR
SELECT ID_US1,ID_US2
FROM T_FRIENDSHIP
WHERE ID_US1=COD_US
AND ID_US2 NOT MEMBER OF IDS_NOT;
END;
END;
/
SHOW ERRORS;
首先你应该像这样创建一个 oracle 类型:
CREATE OR REPLACE TYPE LIST_IDS AS TABLE OF INT;
然后您应该使用过程和嵌套的 table 参数创建包,如下所示:
CREATE OR REPLACE PACKAGE PACKFACE IS
TYPE LISTADO_IDS IS TABLE OF INT INDEX BY PLS_INTEGER;
PROCEDURE P_SELECT_IDBFRIENDS (CONSULTA OUT SYS_REFCURSOR,COD_US IN INT,IDS_NOT IN LISTADO_IDS);
END;
最后你应该创建正文。您将数据从 oracle 类型传递到嵌套 table,如下所示:
CREATE OR REPLACE PACKAGE BODY PACKFACE IS
PROCEDURE P_SELECT_IDBFRIENDS (CONSULTA OUT SYS_REFCURSOR,COD_US IN INT, IDS_NOT IN LISTADO_IDS)
IS
num_array FACEBOOK.LIST_IDS;
BEGIN
num_array:=LIST_IDS();
for i in 1 .. IDS_NOT.count
loop
num_array.extend(1);
num_array(i) := IDS_NOT(i);
end loop;
OPEN CONSULTA FOR
SELECT ID_US1,ID_US2 FROM T_FRIENDSHIP WHERE ID_US1=COD_US AND ID_US2 NOT IN (SELECT COLUMN_VALUE FROM TABLE(num_array));
END;
END;
我做到了,并且得到了 python 错误数字或类型参数错误的解决方案。祝你好运。