如何在BEGIN之后声明游标?

oli*_*via 6 oracle syntax plsql cursor

我想知道是否可以在之后声明游标BEGIN.

如何将plsql的结果导出到Excel工作表,因为我必须将此过程作为作业运行.

CREATE OR REPLACE PROCEDURE masc(v_amsprogramid VARCHAR2) AS

  v_mid VARCHAR2(50);
  v_sid VARCHAR2(50);

  CURSOR c1 IS
    SELECT DISTINCT mid
    FROM table_a WHERE aid = v_aid
    ORDER BY mid;

  BEGIN

    OPEN c1;

    LOOP
      FETCH c1 INTO v_mid;
      EXIT WHEN c1%NOTFOUND;

      DECLARE
        CURSOR c2 IS
          SELECT DISTINCT sid INTO v_sid
          FROM table_b WHERE mid = v_mid;

      BEGIN
        OPEN c2;
        LOOP

          FETCH c1 INTO v_mid;
          EXIT WHEN c1%NOTFOUND;

          dbms_output.PUT_LINE('MID : ' || v_mid);
          dbms_output.PUT_LINE('Sid : ' || v_sid);

        END LOOP;

        CLOSE c2;
      END LOOP;

      CLOSE c1;
  END masc;
Run Code Online (Sandbox Code Playgroud)

Lal*_*r B 4

我想知道是否可以在开始后声明游标

不完全是。但是您可以使用游标 for 循环而不是声明显式游标

例如,

FOR i IN (SELECT distinct MID from table_a WHERE AID = V_AID ORDER BY MID)
LOOP
   <do something>
END LOOP;
Run Code Online (Sandbox Code Playgroud)

但无论如何,这会更慢,因为逐行的速度会越来越慢。我认为根本不需要任何程序。如果您确实需要在PL/SQL中执行此操作,请考虑BULK COLLECT

我如何将 plsql 的结果导出到 Excel 工作表,因为我希望将此过程作为作业运行。

我认为在这种情况下不需要PL/SQL。您可以简单地在SQL*Plus中使用SPOOL

例如,

sqlplus user/pass@service_name
<required formatting options>

SPOOL /location/myfile.csv
SELECT distinct MID from table_a WHERE AID = V_AID ORDER BY MID;
SPOOL OFF
Run Code Online (Sandbox Code Playgroud)