Uploaded image for project: 'MariaDB Server'
  1. MariaDB Server
  2. MDEV-10142 PL/SQL parser
  3. MDEV-10597

sql_mode=ORACLE: Cursors with parameters

    XMLWordPrintable

Details

    • 10.2.2-3, 10.2.2-1, 10.2.2-2, 10.2.2-4, 10.1.18

    Description

      Add optional parameter list into CURSOR declaration and OPEN.

      Example:

      DROP TABLE t1;
      CREATE TABLE t1 (a INT, b INT, c INT);
      INSERT INTO t1 VALUES (1,2,3);
      DECLARE
        CURSOR c (prm_a VARCHAR2, prm_b VARCHAR2) IS
          SELECT a, b, c FROM t1 WHERE a=prm_a AND b=prm_b;
        v_a INT;
        v_b INT;
        v_c INT;
      BEGIN
        OPEN c(1, 2);
        FETCH c INTO v_a, v_b, v_c;
        CLOSE c;
        INSERT INTO t1 VALUES (v_a + 10, v_b + 10, v_c + 10);
      EXCEPTION
        WHEN NO_DATA_FOUND THEN RETURN;
      END;
      /
      SELECT * FROM t1;
      DROP TABLE t1;
      

      	 A	    B	       C
      ---------- ---------- ----------
      	 1	    2	       3
      	11	   12	      13
      

      Cursor parameter name space

      Cursor parameters exists in a separate name space and shadow the variables declared on the same level with the cursor, or on upper levels. This script:

      SET SERVEROUTPUT ON ;
      DROP TABLE t1;
      DROP PROCEDURE p1;
      CREATE TABLE t1 (a INT);
      INSERT INTO t1 VALUES (1);
      CREATE PROCEDURE p1(a INT)
      AS
        v_a INT:=NULL;
        p_a INT:=NULL;
        CURSOR c (p_a VARCHAR2) IS SELECT a FROM t1 WHERE p_a IS NOT NULL;
      BEGIN
        OPEN c(a);
        FETCH c INTO v_a;
        IF c%NOTFOUND THEN
        BEGIN
          DBMS_OUTPUT.PUT_LINE('No records found');
          RETURN;
        END;
        END IF;
        CLOSE c;
        DBMS_OUTPUT.PUT_LINE('Fetched a record a='||TO_CHAR(v_a));
        INSERT INTO t1 VALUES (v_a);
        COMMIT;
      END;
      /
      CALL p1(1);
      SELECT * FROM t1;
      

      returns

      SQL> Fetched a record a=1
      

      SQL> 
      	 A
      ----------
      	 1
      	 1
      

      Notice, the procedure call inserted the second record into the table t1, because the cursor parameter p_a shadowed the local variable p_a and the condition WHERE p_a IS NOT NULL evaluated to TRUE, because the cursor parameter p_a was initialized to 1 at OPEN c(a) time. The value of the local variable p_a is not important, as it's not visible in the cursor SELECT expression.

      Attachments

        Issue Links

          Activity

            People

              bar Alexander Barkov
              bar Alexander Barkov
              Votes:
              0 Vote for this issue
              Watchers:
              2 Start watching this issue

              Dates

                Created:
                Updated:
                Resolved:

                Git Integration

                  Error rendering 'com.xiplink.jira.git.jira_git_plugin:git-issue-webpanel'. Please contact your Jira administrators.