oracle - 如何在开始后声明游标?

标签 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;

最佳答案

I want to know if i can declare a cursor after begin



不完全是。但是你可以使用 循环游标而不是声明 显式光标 .

例如,
FOR i IN (SELECT distinct MID from table_a WHERE AID = V_AID ORDER BY MID)
LOOP
   <do something>
END LOOP;

但无论如何,这会更慢,因为逐行是缓慢的。我认为根本不需要程序。如果你真的需要在 PL/SQL 然后考虑批量收集 .

And how can i export the result of the plsql to an excel sheet because i ahev to run this procedure as a job.



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

例如,
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

关于oracle - 如何在开始后声明游标?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33387022/

相关文章:

sql - 使用宏将值传递给查询时,是否可以在不存在值的情况下继续查询?

java - 通过java访问oracle sql字段

安卓开发 : Efficient Syntax Highlighting Tips?

oracle - ORA-01007 "variable not in select list"来自 dbms_sql.column_value 调用

java - 如何使用java获取表的不可空列?

oracle - 如何约束数据库表,以便只有一行可以在列中具有特定值?

oracle - 在 SQL Plus 中使用绑定(bind)变量返回多行?

jquery - 迭代 JSON 列表会产生 "Error: Syntax error, unrecognized expression"

python - python 中的数字 - 010

oracle - 将字符串数组传递给过程并在带有 IN 的 WHERE 子句中使用它