[Oracle pl / sql在尝试引用查询中的plsql表时出现问题

问题描述 投票:1回答:2

当我尝试在查询中引用plsql表记录时,出现pls-201错误。

这里是问题的示例:

DECLARE
 TYPE trxtypeinforec IS RECORD(
    NAME ra_cust_trx_types.NAME%TYPE
    );

  TYPE trxtypeinfotab IS TABLE OF trxtypeinforec
   INDEX BY PLS_INTEGER;

   g_inv_type        trxtypeinfotab;
   l_result VARCHAR2 (100);

BEGIN
    g_inv_type(1).NAME := 'Test';

    SELECT g_inv_type(qry.ID).NAME
    INTO l_result
    FROM (SELECT 1 ID
            FROM dual) qry;

END;

错误报告-ORA-06550:第15行,第23列:PLS-00201:标识符必须将“ QRY.ID”声明为ORA-06550:第15行,第23列:PLS-00201:标识符'QRY.ID'必须声明为ORA-06550:第15行,第12列:PL / SQL:ORA-00904::无效的标识符ORA-06550:第15行,第5列:PL / SQL:忽略了SQL语句06550。00000-“%s行,%s列:\ n%s”*原因:通常是PL / SQL编译错误。*操作:

oracle plsql
2个回答
0
投票

首先从SELECT中检索索引到局部变量,然后将关联数组中的值分配给PL / SQL范围而不是SQL范围中的l_result

DECLARE
  TYPE trxtypeinforec IS RECORD(
    NAME ra_cust_trx_types.NAME%TYPE
  );

  TYPE trxtypeinfotab IS TABLE OF trxtypeinforec INDEX BY PLS_INTEGER;

   g_inv_type  trxtypeinfotab;
   idx         PLS_INTEGER;
   l_result    ra_cust_trx_types.NAME%TYPE;

BEGIN
  g_inv_type(1).NAME := 'Test';

  SELECT 1
  INTO   idx
  FROM   DUAL;

  l_result := g_inv_type(idx).NAME;

  DBMS_OUTPUT.PUT_LINE( l_result );
END;
/

输出:

测试

db <>小提琴here


0
投票

请尝试使用光标。

SET SERVEROUTPUT ON;
DECLARE
 TYPE trxtypeinforec IS RECORD(
    NAME ra_cust_trx_types.NAME%TYPE
    );

  TYPE trxtypeinfotab IS TABLE OF trxtypeinforec
   INDEX BY PLS_INTEGER;

   g_inv_type        trxtypeinfotab;
   l_result VARCHAR2 (100);

   -- Query for retrieving index goes in the cursor or use existing cursor
   CURSOR cur_id  IS 
   SELECT 1 AS ID FROM DUAL;

BEGIN
    -- Populate records here or put inside loop as required
    g_inv_type(1).NAME := 'Test';

    -- Loop through the cursor to get the relevant index    
    FOR rec in cur_id
    LOOP
        SELECT g_inv_type(rec.ID).NAME
        INTO l_result
        FROM DUAL;
        dbms_output.put_line (l_result);
    END LOOP;

END;
/

如果我们可以获取有关现有游标如何获取索引值的更多信息,将很有帮助。

输出:

测试

PL / SQL过程成功完成。

© www.soinside.com 2019 - 2024. All rights reserved.