2012-07-11 49 views
0

封装例如阵列(表)参数这个问题是我的问题的一部分how to pass javascript array to oracle store procedure by ado parameter objectOracle存储过程接受需要

我认为这鸿沟3个小零件会得到回答得更快。

对于这个问题。

我知道我们可以声明一个表类型和使用

select last_name 
from employees in (select * from table(cast(my_table_type_var as my_table_type)); 

,但我总是从创建新的软件包,其中包括一个程序有此错误。我读了一些线程说我需要删除一个sql(模式)类型,因为sql和pl/slq不使用相同的引擎。我试图通过SPL模式创建类型*加,但仍然得到同样的错误 所以我需要一个工作包例如,对于这第一个请。

回答

1

你需要一个SQL对象从SELECT调用TABLE操作。这里有一个小例子(在9iR2):

SQL> CREATE TYPE table_number is TABLE OF NUMBER; 
    2/

Type created. 

SQL> SELECT * FROM TABLE(table_number(1,2,3)); 

COLUMN_VALUE 
------------ 
      1 
      2 
      3 

你可以在这里使用一个函数,而不是(请注意,我的类型是包外还定义):

SQL> CREATE OR REPLACE PACKAGE pkg AS 
    2  FUNCTION f RETURN table_number; 
    3 END; 
    4/

Package created. 

SQL> CREATE OR REPLACE PACKAGE BODY pkg AS 
    2  FUNCTION f RETURN table_number IS 
    3  BEGIN 
    4  RETURN table_number(4,5,6); 
    5  END; 
    6 END; 
    7/

Package body created. 

SQL> SELECT * FROM table(pkg.f); 

COLUMN_VALUE 
------------ 
      4 
      5 
      6 
+0

非常感谢你,你的例子后,我阅读[表函数描述](http://www.oracle-base.com/articles/misc/pipelined-table-functions.php),我明白了这一点。但我正在调试我自己的包存储过程,创建它没有错误,但我调用它时出错。我是新手,我不知道如何合法地评论我的代码。我通过下一个评论添加我的所有同事。希望您能够帮助我。 – 2012-07-11 18:36:11

+0

CREATE OR REPLACE TYPE t_table IS TABLE VARCHAR2(255); / CREATE OR REPLACE PACKAGE simon_pkg IS TYPE t_table IS VARCHAR2的表(255); TYPE c_cursor IS ref CURSOR; 程序F(在t_table t_input,c_out出c_cursor); END; / CREATE OR REPLACE PACKAGE BODY simon_pkg IS 程序F(在t_table t_input,c_out出c_cursor) IS v_cursor c_cursor; BEGIN OPEN v_cursor FOR SELECT last_name FROM employees WHERE last_name IN(SELECT * FROM TABLE(t_input)); c_out:= v_cursor; END f; END; / – 2012-07-11 18:38:14

+0

我将创建一个新的question.I可以在甲酸盐评论我的代码。 – 2012-07-11 18:41:30