How to store selection result in to variable in Oracle procedure

前端 未结 2 1781
失恋的感觉
失恋的感觉 2021-02-08 22:11

I write a simple procedure. I try to store selection result in variable. I use \"SELECT INTO\" query but I can not doing this.

Example:

DECLARE
     v_em         


        
相关标签:
2条回答
  • 2021-02-08 22:24

    IF your SELECT returns more than one row, you won't be able to use the SELECT INTO synthax.

    You will need to build a loop to navigate through the resulte set:

    Adam demonstrated how you would use an explicit cursor and a bulk collect loop. I will show how you can build the simplest loop possible (implicit cursor, doesn't need a DECLARE section):

    BEGIN
       FOR c_emp IN (SELECT * 
                       FROM Employee 
                      WHERE Salary > 10) LOOP
          /* do something with each row, for example:*/
          UPDATE foo SET bar = bar + c_emp.salary WHERE id = c_emp.id;
       END LOOP;
    END;
    
    0 讨论(0)
  • 2021-02-08 22:36

    You have a couple options. You could turn that query into a cursor:

    DECLARE
         CURSOR v_employeeRecords IS
              SELECT * FROM Employee WHERE Salary > 10;
         v_employeeRecord  employee%ROWTYPE;
    BEGIN
         FOR v_employeeRecord IN v_employeeRecords LOOP
              /* Do something with v_employeeRecord */
         END LOOP;
    END;
    

    Or, you can create a TABLE variable:

    DECLARE
         v_employeeRecord  employee%ROWTYPE;
         v_employeeRecords IS TABLE OF employee%ROWTYPE;
         i BINARY_INTEGER;
    BEGIN
     SELECT * BULK COLLECT INTO v_employeeRecords
          FROM Employee WHERE Salary > 10;
    
     i := v_employeeRecords.FIRST;
     WHILE v_employeeRecords.EXISTS(i) LOOP
         v_employeeRecord := v_employeeRecords(i);
         /* Do something with v_employeeRecord */
         i := v_employeeRecords.NEXT(i);
     END;
    END;
    

    I haven't tried these samples in Oracle, so you may get compiler errors...

    0 讨论(0)
提交回复
热议问题