将程序转换为函数时如何解决语法错误?

时间:2019-04-24 07:51:56

标签: postgresql

我正在将SQL Server的存储过程转换为PostgreSQL中的存储函数。我将存储过程转换为函数。转换后,我在pgadmin中运行了该脚本,但是如果条件接近,它将给出语法错误。

存储的功能:

<html>

<head>
  <script>
    function addRow() {
      var table = document.getElementById("bod");
      var rowCount = table.rows.length;
      var row = table.insertRow(rowCount);

      row.insertCell(0).innerHTML = '<input type="text" name="purpose_dy[]" class = "uname" id="purpose" size="20" onkeyup="success()"/>';
      row.insertCell(1).innerHTML = '<input type="text" name="wafernum_dy[]" class = "wafernum" id="wafernum" size="20" onkeyup="success()"/>';
      row.insertCell(2).innerHTML = '<input type="text" name="cell_dy[]" class = "cell" id="cell" size="20" onkeyup="success()"/>';
      row.insertCell(3).innerHTML = '<input type="text" name="qty_dy[]" class = "qty" id="qty" size="20" onkeyup="success()"/>';
      row.insertCell(4).innerHTML = '<input type="text" name="remarks_dy[]" class = "remarks" id="remarks" size="20" onkeyup="success()"/>';
      row.insertCell(5).innerHTML = '<input type="button" value="Delete" onClick="Javacsript:deleteRow(this)"/>';
    }

    function success() {
    // get all the elements present in form
    var unameArray = document.getElementsByClassName("uname");
    var ageArray = document.getElementsByClassName("age");
    var cellArray = document.getElementsByClassName("cell");
    var qtyArray = document.getElementsByClassName("qty");
    var wafernumArray = document.getElementsByClassName("wafernum");
     var purposeArray = document.getElementsByClassName("purpose");
    var remarksArray = document.getElementsByClassName("remarks");
    // Check for number of tr
    var rowCount = document.getElementById("bod").rows.length;
    for(var i=0;i<rowCount;i++) {
       var uname = unameArray[i];
       var age = ageArray[i];
       var cell = cellArray[i];
       var qty = qtyArray[i];
       var wafernum = wafernumArray[i];
       var purpose = purposeArray[i];
       var remarks = remarksArray[i];
       if (uname === "" || age === "" || cell === "" || qty === "" || wafernum === "" || purpose === "" ||            remarks === "") {
         document.getElementById('submit_form').disabled = true;
        document.getElementById('submit_form').style.backgroundColor = "initial";
        break;
      } else {
        document.getElementById('submit_form').disabled = false;
        document.getElementById('submit_form').style.backgroundColor = "yellow";
      }
    }
       
    }
      
  </script>

  <style>

  </style>
</head>

<body>
  Name: <input type="text" id="uname" /> Age: <input type="text" id="age" />
  <input type="button" id="add" value="Add" onclick="Javascript:addRow();">
  <table id="bod">
    <tr>
      <th>PURPOSE</th>
      <th>WAFERNUM</th>
      <th>CELL</th>
      <th>QTY</th>
      <th>REMARKS</th>
    </tr>
  </table>
  <input type="submit" name="submit" id="submit_form" value="Submit" onclick="SaveData()" disabled>
</body>

</html>

错误:

在条件附近显示语法错误。我在下面添加了错误代码:

    CREATE OR REPLACE FUNCTION getuserdepartmentlist(p_nUserID  bigInt,p_sRole varchar(100),p_nInstID  bigInt = 0) RETURNS TEXT
        AS $BODY$   
            ----get dept list for non admin users
            DECLARE v_DeptID bigint;
                v_DeptIDList text;
                v_isAdmin int;
                v_isPM int;
                v_isDelgate int;
        BEGIN
         v_DeptIDList :=''; 
         v_isAdmin :=POSITION('Admin' IN p_sRole);
         v_isPM :=POSITION('PM' IN p_sRole);
         v_isDelgate :=POSITION('Delegate' IN p_sRole);

            --Cursor Declaration for Admin/pm
            DECLARE DeptCursor1 CURSOR FOR 
                        SELECT  department.ndept_id 
                                FROM   department
                                WHERE  ninst_id = p_nInstID; 

            --Cursor Declaration for non Admin/pm
            DECLARE DeptCursor2 CURSOR FOR 
                        SELECT  department.ndept_id 
                                FROM    users INNER JOIN
                                    permission ON users.nuser_id = permission.nuser_id INNER JOIN
                                    userrolemapping ON users.nuser_id = userrolemapping.nuser_id INNER JOIN
                                    department ON permission.ndept_inst = department.ninst_id
                                    AND  department.ninst_id = p_nInstID
                                WHERE     
                                    users.nuser_id = p_nUserID and
                                    spermission_type <> 'N' AND
                                    permission.sperm_level = 'D' AND 
                                    users.bis_active = 1 AND 
                                    userrolemapping.nrole_id NOT IN 
                                                (SELECT nrole_id  
                                                    FROM  roles
                                                    WHERE  srole_desc in ('Admin','PM'))                                
                    Union
                        SELECT  department.ndept_id 
                                FROM  users 
INNER JOIN permission ON users.nuser_id = permission.nuser_id 
INNER JOIN userrolemapping ON users.nuser_id = userrolemapping.nuser_id 
INNER JOIN department ON permission.ndept_inst = department.ninst_id
                                AND  department.ninst_id = p_nInstID 
                                WHERE     
                                    users.nuser_id = p_nUserID and
                                    spermission_type  <> 'N' AND
                                    permission.sperm_level = 'I' AND 
                                    users.bis_active = 1 AND 
                                    userrolemapping.nrole_id NOT IN 
                                                (SELECT nrole_id  
                                                    FROM  roles
                                                    WHERE  srole_desc in ('Admin','PM'));

            IF (v_isAdmin > 0) OR (v_isPM > 0) OR (v_isDelgate >0)
                THEN
                    --Cursor for Admin & PM
                    OPEN DeptCursor1;
                    FETCH NEXT FROM; DeptCursor1
                    INTO v_DeptID

                    WHILE FOUND
                        LOOP
                            v_DeptIDList := v_DeptIDList || '' || cast(v_DeptID as varchar(1)) || ','; 

                                -- Get the next vendor.
                        FETCH NEXT FROM; DeptCursor1 
                        INTO v_DeptID 
                        END LOOP; 
                    CLOSE DeptCursor1;
            ELSE    
                    --Cursor for Non Admin
                    OPEN DeptCursor2;

                    FETCH NEXT FROM; DeptCursor2 
                    INTO v_DeptID

                    WHILE FOUND
                        LOOP
                            v_DeptIDList := v_DeptIDList || '' || cast(v_DeptID as varchar(1)) || ','; 

                                -- Get the next vendor.
                        FETCH NEXT FROM; DeptCursor2 
                        INTO v_DeptID 
                        END LOOP; 
                    CLOSE DeptCursor2;

            END IF;         
                    RETURN(v_DeptIDList);
        END;
        $$LANGUAGE plpgsql;

1 个答案:

答案 0 :(得分:0)

此代码可以正常工作,没有错误。上面的代码中的游标声明是错误的。

CREATE OR REPLACE FUNCTION getuserdepartmentlist(p_nUserID  bigInt,p_sRole varchar(100),p_nInstID  bigInt = 0)
      RETURNS TEXT
AS
$BODY$  
    ----get dept list for non admin users
    DECLARE v_DeptID bigint;
        v_DeptIDList text;
        v_isAdmin int;
        v_isPM int;
        v_isDelgate int;
        --Cursor Declaration for Admin/pm
    DECLARE DeptCursor1 CURSOR FOR 
                SELECT  department.ndept_id 
                        FROM   department
                        WHERE  ninst_id = p_nInstID; 


    --Cursor Declaration for non Admin/pm
    DECLARE DeptCursor2 CURSOR FOR 
                SELECT  department.ndept_id 
                        FROM    users INNER JOIN
                            permission ON users.nuser_id = permission.nuser_id INNER JOIN
                            userrolemapping ON users.nuser_id = userrolemapping.nuser_id INNER JOIN
                            department ON permission.ndept_inst = department.ninst_id
                            AND  department.ninst_id = p_nInstID
                        WHERE     
                            users.nuser_id = p_nUserID and
                            spermission_type <> 'N' AND
                            permission.sperm_level = 'D' AND 
                            users.bis_active = 1 AND 
                            userrolemapping.nrole_id NOT IN 
                                        (SELECT nrole_id  
                                            FROM  roles
                                            WHERE  srole_desc in ('Admin','PM'))                                
            Union
                SELECT     department.ndept_id 
                        FROM    users INNER JOIN
                                    permission ON users.nuser_id = permission.nuser_id INNER JOIN
                            userrolemapping ON users.nuser_id = userrolemapping.nuser_id INNER JOIN
                            department ON permission.ndept_inst = department.ninst_id
                            AND  department.ninst_id = p_nInstID 
                        WHERE     
                            users.nuser_id = p_nUserID and
                            spermission_type  <> 'N' AND
                            permission.sperm_level = 'I' AND 
                            users.bis_active = 1 AND 
                            userrolemapping.nrole_id NOT IN 
                                        (SELECT nrole_id  
                                            FROM  roles
                                            WHERE  srole_desc in ('Admin','PM'));



BEGIN

 v_DeptIDList :=''; 
 v_isAdmin :=POSITION('Admin' IN p_sRole);
 v_isPM :=POSITION('PM' IN p_sRole);
 v_isDelgate :=POSITION('Delegate' IN p_sRole);


    IF (v_isAdmin > 0) OR (v_isPM > 0) OR (v_isDelgate >0)
        THEN
            --Cursor for Admin & PM
            OPEN DeptCursor1;

            FETCH NEXT FROM DeptCursor1
            INTO v_DeptID;

            WHILE FOUND
                LOOP
                    v_DeptIDList := v_DeptIDList || '' || cast(v_DeptID as varchar(1)) || ','; 

                        -- Get the next vendor.
                FETCH NEXT FROM DeptCursor1 
                INTO v_DeptID; 
                END LOOP; 
            CLOSE DeptCursor1;
    ELSE    
            --Cursor for Non Admin
            OPEN DeptCursor2;

            FETCH NEXT FROM DeptCursor2 
            INTO v_DeptID;

            WHILE FOUND
                LOOP
                    v_DeptIDList := v_DeptIDList || '' || cast(v_DeptID as varchar(1)) || ','; 

                        -- Get the next vendor.
                FETCH NEXT FROM DeptCursor2 
                INTO v_DeptID; 
                END LOOP; 
            CLOSE DeptCursor2;

    END IF;                             
            --End cursor declaration 


            if len(v_DeptIDList)> 0 then 
                v_DeptIDList := SUBSTRING(v_DeptIDList,1,len(v_DeptIDList)-1);
            else
                v_DeptIDList :='0';
            end if;

            RETURN(v_DeptIDList);
END;
$BODY$
LANGUAGE plpgsql;