当前位置: 首页 > 知识库问答 >
问题:

EXCECT fetch在toad中返回的行数多于请求行数

杜经艺
2023-03-14
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;
/

共有1个答案

穆俊杰
2023-03-14

正如在注释中已经提到的,不要将包添加到系统或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;
/
 类似资料: