Postgres cursor targets











up vote
0
down vote

favorite












I would appreciate advice on best practices to create a pg9.6 structure to hold multiple rows from multiple joined tables as a cursor target. The docs were not clear on this, other searches seemed to indicate using temp table, such as below.



DECLARE
mycursor refcursor;
BEGIN
CREATE TEMPORARY TABLE tmp_persons (
personid INTEGER,
primaryconnect INTEGER
);
OPEN mycursor FOR SELECT p.personid,c.primaryconnect FROM tpersons p JOIN tconnections c ON .....
LOOP
FETCH mycursor INTO tmp_persons;

.. do something using tmp_persons.personid, tmp_persons.primaryconnect









share|improve this question




























    up vote
    0
    down vote

    favorite












    I would appreciate advice on best practices to create a pg9.6 structure to hold multiple rows from multiple joined tables as a cursor target. The docs were not clear on this, other searches seemed to indicate using temp table, such as below.



    DECLARE
    mycursor refcursor;
    BEGIN
    CREATE TEMPORARY TABLE tmp_persons (
    personid INTEGER,
    primaryconnect INTEGER
    );
    OPEN mycursor FOR SELECT p.personid,c.primaryconnect FROM tpersons p JOIN tconnections c ON .....
    LOOP
    FETCH mycursor INTO tmp_persons;

    .. do something using tmp_persons.personid, tmp_persons.primaryconnect









    share|improve this question


























      up vote
      0
      down vote

      favorite









      up vote
      0
      down vote

      favorite











      I would appreciate advice on best practices to create a pg9.6 structure to hold multiple rows from multiple joined tables as a cursor target. The docs were not clear on this, other searches seemed to indicate using temp table, such as below.



      DECLARE
      mycursor refcursor;
      BEGIN
      CREATE TEMPORARY TABLE tmp_persons (
      personid INTEGER,
      primaryconnect INTEGER
      );
      OPEN mycursor FOR SELECT p.personid,c.primaryconnect FROM tpersons p JOIN tconnections c ON .....
      LOOP
      FETCH mycursor INTO tmp_persons;

      .. do something using tmp_persons.personid, tmp_persons.primaryconnect









      share|improve this question















      I would appreciate advice on best practices to create a pg9.6 structure to hold multiple rows from multiple joined tables as a cursor target. The docs were not clear on this, other searches seemed to indicate using temp table, such as below.



      DECLARE
      mycursor refcursor;
      BEGIN
      CREATE TEMPORARY TABLE tmp_persons (
      personid INTEGER,
      primaryconnect INTEGER
      );
      OPEN mycursor FOR SELECT p.personid,c.primaryconnect FROM tpersons p JOIN tconnections c ON .....
      LOOP
      FETCH mycursor INTO tmp_persons;

      .. do something using tmp_persons.personid, tmp_persons.primaryconnect






      postgresql plpgsql postgres-9.6






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited Nov 11 at 8:57









      a_horse_with_no_name

      290k46439535




      290k46439535










      asked Nov 9 at 22:56









      user542319

      1881314




      1881314
























          1 Answer
          1






          active

          oldest

          votes

















          up vote
          0
          down vote













          I hope so documentation is clean.




          FETCH retrieves the next row from the cursor into a target, which might be a row variable, a record variable, or a comma-separated list of simple variables, just like SELECT INTO. If there is no next row, the target is set to NULL(s). As with SELECT INTO, the special variable FOUND can be checked to see whether a row was obtained or not.




          So you cannot to use temporary table as target. Use record variable if there are not any special requirement:



          DECLARE 
          r record;
          mycursor refcursor;
          BEGIN
          OPEN mycursor ..
          LOOP
          FETCH mycursor INTO r;
          EXIST WHEN NOT FOUND;
          RAISE NOTICE 'personid: %', r.personid;


          For this simple task is better to use FOR IN SELECT statement.



          DECLARE r record;
          BEGIN
          FOR r IN SELECT p.personid, ...
          LOOP
          RAISE NOTICE 'personid: %', r.personid;





          share|improve this answer





















            Your Answer






            StackExchange.ifUsing("editor", function () {
            StackExchange.using("externalEditor", function () {
            StackExchange.using("snippets", function () {
            StackExchange.snippets.init();
            });
            });
            }, "code-snippets");

            StackExchange.ready(function() {
            var channelOptions = {
            tags: "".split(" "),
            id: "1"
            };
            initTagRenderer("".split(" "), "".split(" "), channelOptions);

            StackExchange.using("externalEditor", function() {
            // Have to fire editor after snippets, if snippets enabled
            if (StackExchange.settings.snippets.snippetsEnabled) {
            StackExchange.using("snippets", function() {
            createEditor();
            });
            }
            else {
            createEditor();
            }
            });

            function createEditor() {
            StackExchange.prepareEditor({
            heartbeatType: 'answer',
            convertImagesToLinks: true,
            noModals: true,
            showLowRepImageUploadWarning: true,
            reputationToPostImages: 10,
            bindNavPrevention: true,
            postfix: "",
            imageUploader: {
            brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
            contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
            allowUrls: true
            },
            onDemand: true,
            discardSelector: ".discard-answer"
            ,immediatelyShowMarkdownHelp:true
            });


            }
            });














            draft saved

            draft discarded


















            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53234306%2fpostgres-cursor-targets%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown

























            1 Answer
            1






            active

            oldest

            votes








            1 Answer
            1






            active

            oldest

            votes









            active

            oldest

            votes






            active

            oldest

            votes








            up vote
            0
            down vote













            I hope so documentation is clean.




            FETCH retrieves the next row from the cursor into a target, which might be a row variable, a record variable, or a comma-separated list of simple variables, just like SELECT INTO. If there is no next row, the target is set to NULL(s). As with SELECT INTO, the special variable FOUND can be checked to see whether a row was obtained or not.




            So you cannot to use temporary table as target. Use record variable if there are not any special requirement:



            DECLARE 
            r record;
            mycursor refcursor;
            BEGIN
            OPEN mycursor ..
            LOOP
            FETCH mycursor INTO r;
            EXIST WHEN NOT FOUND;
            RAISE NOTICE 'personid: %', r.personid;


            For this simple task is better to use FOR IN SELECT statement.



            DECLARE r record;
            BEGIN
            FOR r IN SELECT p.personid, ...
            LOOP
            RAISE NOTICE 'personid: %', r.personid;





            share|improve this answer

























              up vote
              0
              down vote













              I hope so documentation is clean.




              FETCH retrieves the next row from the cursor into a target, which might be a row variable, a record variable, or a comma-separated list of simple variables, just like SELECT INTO. If there is no next row, the target is set to NULL(s). As with SELECT INTO, the special variable FOUND can be checked to see whether a row was obtained or not.




              So you cannot to use temporary table as target. Use record variable if there are not any special requirement:



              DECLARE 
              r record;
              mycursor refcursor;
              BEGIN
              OPEN mycursor ..
              LOOP
              FETCH mycursor INTO r;
              EXIST WHEN NOT FOUND;
              RAISE NOTICE 'personid: %', r.personid;


              For this simple task is better to use FOR IN SELECT statement.



              DECLARE r record;
              BEGIN
              FOR r IN SELECT p.personid, ...
              LOOP
              RAISE NOTICE 'personid: %', r.personid;





              share|improve this answer























                up vote
                0
                down vote










                up vote
                0
                down vote









                I hope so documentation is clean.




                FETCH retrieves the next row from the cursor into a target, which might be a row variable, a record variable, or a comma-separated list of simple variables, just like SELECT INTO. If there is no next row, the target is set to NULL(s). As with SELECT INTO, the special variable FOUND can be checked to see whether a row was obtained or not.




                So you cannot to use temporary table as target. Use record variable if there are not any special requirement:



                DECLARE 
                r record;
                mycursor refcursor;
                BEGIN
                OPEN mycursor ..
                LOOP
                FETCH mycursor INTO r;
                EXIST WHEN NOT FOUND;
                RAISE NOTICE 'personid: %', r.personid;


                For this simple task is better to use FOR IN SELECT statement.



                DECLARE r record;
                BEGIN
                FOR r IN SELECT p.personid, ...
                LOOP
                RAISE NOTICE 'personid: %', r.personid;





                share|improve this answer












                I hope so documentation is clean.




                FETCH retrieves the next row from the cursor into a target, which might be a row variable, a record variable, or a comma-separated list of simple variables, just like SELECT INTO. If there is no next row, the target is set to NULL(s). As with SELECT INTO, the special variable FOUND can be checked to see whether a row was obtained or not.




                So you cannot to use temporary table as target. Use record variable if there are not any special requirement:



                DECLARE 
                r record;
                mycursor refcursor;
                BEGIN
                OPEN mycursor ..
                LOOP
                FETCH mycursor INTO r;
                EXIST WHEN NOT FOUND;
                RAISE NOTICE 'personid: %', r.personid;


                For this simple task is better to use FOR IN SELECT statement.



                DECLARE r record;
                BEGIN
                FOR r IN SELECT p.personid, ...
                LOOP
                RAISE NOTICE 'personid: %', r.personid;






                share|improve this answer












                share|improve this answer



                share|improve this answer










                answered Nov 11 at 18:40









                Pavel Stehule

                22.2k34856




                22.2k34856






























                    draft saved

                    draft discarded




















































                    Thanks for contributing an answer to Stack Overflow!


                    • Please be sure to answer the question. Provide details and share your research!

                    But avoid



                    • Asking for help, clarification, or responding to other answers.

                    • Making statements based on opinion; back them up with references or personal experience.


                    To learn more, see our tips on writing great answers.





                    Some of your past answers have not been well-received, and you're in danger of being blocked from answering.


                    Please pay close attention to the following guidance:


                    • Please be sure to answer the question. Provide details and share your research!

                    But avoid



                    • Asking for help, clarification, or responding to other answers.

                    • Making statements based on opinion; back them up with references or personal experience.


                    To learn more, see our tips on writing great answers.




                    draft saved


                    draft discarded














                    StackExchange.ready(
                    function () {
                    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53234306%2fpostgres-cursor-targets%23new-answer', 'question_page');
                    }
                    );

                    Post as a guest















                    Required, but never shown





















































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown

































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown







                    這個網誌中的熱門文章

                    Tangent Lines Diagram Along Smooth Curve

                    Yusuf al-Mu'taman ibn Hud

                    Zucchini