确切的获取返回的值超过了蟾蜍中要求的行数

时间:2018-10-10 09:06:41

标签: oracle stored-procedures plsql

我是过程的新手,正在尝试创建如下所示的代码:

CREATE OR REPLACE PROCEDURE SYSTEM.tiii IS




 v_full_name VARCHAR2(500);
  sal varchar(200);
  jobid varchar(100);
  cpct varchar(50);
  mgid varchar(25);
  did varchar(20);
  cid varchar(20);
  rid varchar(20);
  lid varchar(20);


BEGIN

select HR.EMPLOYEES.FIRST_NAME||' '||HR.EMPLOYEES.LAST_NAME AS 
 Full_Name,HR.EMPLOYEES.SALARY as sal,HR.EMPLOYEES.JOB_ID as ji,
 HR.EMPLOYEES.COMMISSION_PCT as cmpct,HR.EMPLOYEES.MANAGER_ID as 
 mgid,HR.EMPLOYEES.DEPARTMENT_ID as dep,HR.COUNTRIES_EXTERNAL.COUNTRY_ID as 
 country,HR.DW_REGION.R_ID as region,
 HR.LOCATIONS.LOCATION_ID as loc
 into v_full_name,sal,jobid,cpct,mgid,did,cid,rid,lid
 from HR.EMPLOYEES
 join HR.DEPARTMENTS ON 
 HR.EMPLOYEES.DEPARTMENT_ID=HR.DEPARTMENTS.DEPARTMENT_ID
 join HR.LOCATIONS    ON HR.DEPARTMENTS.LOCATION_ID=HR.LOCATIONS.LOCATION_ID
 join HR.COUNTRIES_EXTERNAL ON HR.LOCATIONS.COUNTRY_ID=HR.COUNTRIES_EXTERNAL.COUNTRY_ID
 join HR.DW_REGION    ON HR.COUNTRIES_EXTERNAL.REGION_ID=HR.DW_REGION.R_ID
 where HR.COUNTRIES_EXTERNAL.COUNTRY_ID='US'
 AND trunc(HR.EMPLOYEES.HIRE_DATE) BETWEEN TO_DATE('16/08/2002','DD/MM/YYYY') AND 
 TO_DATE('07/12/2007','DD/MM/YYYY');

END tiii;
/

但请继续获取此错误:

ORA-01422:精确提取返回的行数超过了请求的行数 ORA-06512:位于“ SYSTEM.TIII”的第35行 ORA-06512:在第2行

请指导查询中的错误在哪里?

1 个答案:

答案 0 :(得分:0)

正如注释中已经提到的,不要将包添加到SYSTEM或SYS模式中!

此外,如果仅从查询中收到一行,则只能获取变量。因此,您可以确保查询永远不会返回多行,或者您需要更改获取数据的方式。一个示例是使用一条记录,然后将其批量收集到该记录的表中:

CREATE OR REPLACE PROCEDURE <<YOUR_SCHEMA>>.tiii IS
    TYPE MyResultsRec IS RECORD(
        v_full_name VARCHAR2(500),
        sal varchar(200),
        jobid varchar(100),
        cpct varchar(50),
        mgid varchar(25),
        did varchar(20),
        cid varchar(20),
        rid varchar(20),
        lid varchar(20)
    );
    TYPE MyResultsTab IS TABLE OF MyResultsRec;
    t_my_results   MyResultsTab; 
BEGIN
    SELECT HR.EMPLOYEES.FIRST_NAME||' '||HR.EMPLOYEES.LAST_NAME AS Full_Name,
           HR.EMPLOYEES.SALARY as sal,
           HR.EMPLOYEES.JOB_ID as ji,
           HR.EMPLOYEES.COMMISSION_PCT as cmpct,
           HR.EMPLOYEES.MANAGER_ID as mgid,
           HR.EMPLOYEES.DEPARTMENT_ID as dep,
           HR.COUNTRIES_EXTERNAL.COUNTRY_ID as country,
           HR.DW_REGION.R_ID as region,
           HR.LOCATIONS.LOCATION_ID as loc
      BULK COLLECT INTO t_my_results 
      FROM HR.EMPLOYEES
     INNER JOIN HR.DEPARTMENTS ON HR.EMPLOYEES.DEPARTMENT_ID=HR.DEPARTMENTS.DEPARTMENT_ID
     INNER JOIN HR.LOCATIONS ON HR.DEPARTMENTS.LOCATION_ID=HR.LOCATIONS.LOCATION_ID
     INNER JOIN HR.COUNTRIES_EXTERNAL ON HR.LOCATIONS.COUNTRY_ID=HR.COUNTRIES_EXTERNAL.COUNTRY_ID
     INNER JOIN HR.DW_REGION    ON HR.COUNTRIES_EXTERNAL.REGION_ID=HR.DW_REGION.R_ID
     WHERE HR.COUNTRIES_EXTERNAL.COUNTRY_ID='US'
       AND trunc(HR.EMPLOYEES.HIRE_DATE) BETWEEN TO_DATE('16/08/2002','DD/MM/YYYY') 
       AND TO_DATE('07/12/2007','DD/MM/YYYY');
END tiii;
/

另一种方法是创建一个游标,然后遍历结果:

CREATE OR REPLACE PROCEDURE <<YOUR_SCHEMA>>.tiii IS
BEGIN
    FOR r_results IN (
        SELECT HR.EMPLOYEES.FIRST_NAME||' '||HR.EMPLOYEES.LAST_NAME AS Full_Name,
               HR.EMPLOYEES.SALARY as sal,
               HR.EMPLOYEES.JOB_ID as ji,
               HR.EMPLOYEES.COMMISSION_PCT as cmpct,
               HR.EMPLOYEES.MANAGER_ID as mgid,
               HR.EMPLOYEES.DEPARTMENT_ID as dep,
               HR.COUNTRIES_EXTERNAL.COUNTRY_ID as country,
               HR.DW_REGION.R_ID as region,
               HR.LOCATIONS.LOCATION_ID as loc
          FROM HR.EMPLOYEES
         INNER JOIN HR.DEPARTMENTS ON HR.EMPLOYEES.DEPARTMENT_ID=HR.DEPARTMENTS.DEPARTMENT_ID
         INNER JOIN HR.LOCATIONS ON HR.DEPARTMENTS.LOCATION_ID=HR.LOCATIONS.LOCATION_ID
         INNER JOIN HR.COUNTRIES_EXTERNAL ON HR.LOCATIONS.COUNTRY_ID=HR.COUNTRIES_EXTERNAL.COUNTRY_ID
         INNER JOIN HR.DW_REGION    ON HR.COUNTRIES_EXTERNAL.REGION_ID=HR.DW_REGION.R_ID
         WHERE HR.COUNTRIES_EXTERNAL.COUNTRY_ID='US'
           AND trunc(HR.EMPLOYEES.HIRE_DATE) BETWEEN TO_DATE('16/08/2002','DD/MM/YYYY') 
           AND TO_DATE('07/12/2007','DD/MM/YYYY')
    LOOP
        -- do something here
        -- access your results like r_results.full_name
    END LOOP;
END tiii;
/

还有其他选项,例如使用光标,但这有望使您对如何进行操作有所了解。