Oracle将游标提取到游标中

Oracle将游标提取到游标中,oracle,stored-procedures,cursor,Oracle,Stored Procedures,Cursor,我只是想知道如何将光标移到另一个光标中。 我有以下包裹: create or replace PACKAGE Matching AS type Cursor_Return is ref Cursor; Procedure Get_Data (Cus_ID in Varchar2, Cursor_back OUT Cursor_Return, Cursor_back2 OUT Cursor_Return); END BARCODEMATCHIN

我只是想知道如何将光标移到另一个光标中。 我有以下包裹:

create or replace
PACKAGE Matching AS 
  type Cursor_Return is ref Cursor;
    Procedure Get_Data
      (Cus_ID in Varchar2,
       Cursor_back OUT Cursor_Return,
       Cursor_back2 OUT Cursor_Return);
END BARCODEMATCHING;

create or replace
PACKAGE BODY Matching AS

  Procedure Matching_Proc
      (Cus_ID in Varchar2,
       Cursor_back OUT Cursor_Return,
       Cursor_back2 OUT Cursor_Return
       ) AS
  BEGIN
    Open Cursor_back for 'Select * from cus.customerHead where CustomerID = ' || cus_Id;
    Open Cursor_back2 for 'Select Cus_Location, Cus_zipcode from cus.customerBody where = CustomerID = ' || cus_ID;
    Fetch Cursor_back2 into Cursor_back;
END Matching_Proc;


END Matching;
这是到目前为止我的代码。我只需要返回光标:“Cursor\u back”。当我尝试运行此代码时,会出现以下错误: ORA-06512:缺少表达式。 有没有办法解决这个问题?我可以声明我的两个列吗?我想用另一种方式将它们交给Cursor_back2? 我只想返回带有两列(最多四列)的游标_,因此我有如下输出:

cus.customerbody.cus_location | cus.customerbody.cus_zipcode | cus.customerhead.cus_id | cus.customerhead.cus_Name | and so on

提前感谢。

您将收到ORA-06512:缺少表达式错误,因为此行中有一个额外的=符号:

Open Cursor_back2 for 'Select Cus_Location, Cus_zipcode from cus.customerBody where = CustomerID = ' || cus_ID;
它应该是where=CustomerID=,而不是where=CustomerID=。但是,游标语句不需要是动态的,您可以使用:

Open Cursor_back for
  Select * from cus.customerHead where CustomerID = cus_Id;
Open Cursor_back2 for
  Select Cus_Location, Cus_zipcode from cus.customerBody where CustomerID = cus_ID;
如果您坚持使用动态版本,在动态版本中,查询在运行时之前无法进行语法检查,那么由于您将cus_ID作为字符串传递,因此可能需要将其作为动态SQL语句的一部分包含在转义单引号中。但是不要使用动态SQL,除非您真的必须这样做

不过,您实际上并不需要两个游标,因为您正试图组合来自两个相关查询的值。您需要表之间的连接,以及一个单独的参数游标,类似于:

Open Cursor_back for
  Select cb.cus_location, cb.cus_zipcode, ch.cus_id, ch.cus_Name
  from cus.customerHead ch
  join cus.customerBody cb
  on cb.customerID = ch.customerID
  where ch.CustomerID =  cus_Id;

非常感谢你的回答。我唯一不知道如何解决的问题是,当我连接这两个表时,我应该从表cus.customerhead获得所有列从cus.customerhead选择*。从第二列开始,我只需要四列。我不能按Columnname为第一个表选择列,因为它应该是依赖于客户id的动态表,例如,客户id中有一个标识符,表示普通客户、业务客户等。根据标识符,我选择一个不同的表。有什么提示吗?@Triples-您可以在选择列表中根据需要从每个表中列出任意多的列,最多1000列。我刚才用了你提到的四个。使用*被认为是不好的做法,但我想在ref游标的上下文中可能是可以的;我还是会把它们都列出来。我使用了表别名,所以只需将customerHead中的所有列作为ch.column_name列出,将customerBody中的列作为cb.column_name列出即可。我不确定是否遵循您的注释编辑-根据客户类型,数据存储在不同的表中?这听起来是个糟糕的主意,但如果你坚持这样做,你可以对每个body表进行联合查询;或者对所有柱使用左侧外部连接,并合并柱。无论如何,所有行都需要相同的列列表。