【问题标题】:Cursor values not accessible光标值不可访问
【发布时间】:2014-10-03 13:53:18
【问题描述】:

我写了以下代码:

PROCEDURE main(errbuf              OUT VARCHAR2,
             retcode             OUT VARCHAR2,
             p_parent_request_id in NUMBER) IS


CURSOR cur_supplier_num  IS
  SELECT stg.rowid, stg.LEGACY_VENDOR_NUMBER, stg.SITE_IDENTIFIER
    FROM XXCONV.GEAS_PA_COSTING_STG STG
  WHERE RECORD_PROCESSING_STATUS IN (1, 2, 5)
  AND STG.LEGACY_VENDOR_NUMBER IS NOT NULL;

TYPE update_line IS TABLE OF   cur_supplier_num%ROWTYPE;
g_supplier_update update_line := update_line();

/* End of addtion 3-Oct-14*/

v_internal_request_id   NUMBER;
v_org_id                NUMBER;
v_vendor_id             NUMBER;
v_parent_request_id     NUMBER;
v_return                NUMBER;
v_record_process_status NUMBER;
v_project_id            NUMBER;
v_task_id               NUMBER;
v_validation_var        VARCHAR2(20);
v_val_user_var          VARCHAR2(20);
v_val_emp_var           VARCHAR2(20);
v_val_exp_type_var      VARCHAR2(20);
v_val_exp_type_link_var VARCHAR2(20);
v_val_proj_name_var     VARCHAR2(20);
v_val_gl_date_var       VARCHAR2(20);
v_val_exp_end_var       VARCHAR2(20);
v_val_exp_item_var      VARCHAR2(20);
v_val_cr_code_var       VARCHAR2(20);
v_val_dr_code_var       VARCHAR2(20);
v_val_curr_var          VARCHAR2(20);
v_r12_project_number    VARCHAR2(240);

BEGIN



dynamic_log('Validation Program Start ');  





BEGIN



    OPEN cur_supplier_num;
    LOOP
        FETCH cur_supplier_num BULK COLLECT
        INTO g_supplier_update LIMIT 2000;

     CLOSE  cur_supplier_num;

    IF g_supplier_update.COUNT > 0
    THEN

       FORALL i IN 1..g_supplier_update.COUNT
           UPDATE XXCONV.GEAS_PA_COSTING_STG stg
           set R12_VENDOR_NUMBER  = (
                            select r12_supplier_code
                            FROM xxconv.supplier_legacy_r12_xref xref
                            WHERE xref.legacy_supplier_code =                                                                                                                              g_supplier_update.Legacy_VENDOR_NUMBER
                            AND xref.site_identifier = g_supplier_update.site_identifier)
           WHERE stg.Legacy_VENDOR_NUMBER = g_supplier_update.LEGACY_VENDOR_NUMBER;
     END IF;
 END LOOP; 
END;

当我编译代码时,我收到错误消息:

Error(285,46): PL/SQL: ORA-00904: "G_SUPPLIER_UPDATE"."LEGACY_VENDOR_NUMBER": invalid identifier
Error(285,64): PLS-00302: component 'LEGACY_VENDOR_NUMBER' must be declared

我无法理解为什么无法识别 LEGACY_VENDOR_NUMBER。欢迎对此提供任何帮助

维韦克

【问题讨论】:

  • 请高亮第 285 行 ...
  • 请不要使用SQL 标记PL/SQL 问题。
  • 回到您的问题,您能否为游标声明中的列提供别名并尝试重新编译代码。
  • 希望您在 11g 或更高版本上使用 WHERE 语句的 WHERE 子句中的集合元素。

标签: oracle plsql cursors


【解决方案1】:

你已经像g_supplier_update(I).XXXXXX一样使用它来访问一个集合,I这里是FOR LOOP生成的索引

FORALL i IN 1..g_supplier_update.COUNT
           UPDATE XXCONV.GEAS_PA_COSTING_STG stg
           set R12_VENDOR_NUMBER  = (
                            select r12_supplier_code
                            FROM xxconv.supplier_legacy_r12_xref xref
                            WHERE xref.legacy_supplier_code = g_supplier_update(I).Legacy_VENDOR_NUMBER
                            AND xref.site_identifier = g_supplier_update(I).site_identifier)
           WHERE stg.Legacy_VENDOR_NUMBER = g_supplier_update(I).LEGACY_VENDOR_NUMBER;

【讨论】:

  • +1 马赫斯瓦兰。我没看到 ;-) 希望 OP 是 11g 或更高。顺便说一句,你的名字太长了,我可以叫你 Mahesh 或者你喜欢的任何简称吗? :-)
  • :) Mahesh 是我的宠物和昵称
  • 好吧,我的猜测很接近 :-) 快乐 Dussera,享受并继续为 Oracle 社区做出贡献。
  • Mahesh,非常感谢,这很有效。拉利特,对不起标签。我会小心的 - Vivek
猜你喜欢
  • 2014-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-01
  • 2016-06-16
相关资源
最近更新 更多