我正在将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;
答案 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;