I am learning Npgsql and PostgreSQL. I am unable to define the output parameter correctly. What am I doing wrong?

Here is the function:

CREATE OR REPLACE FUNCTION Insert_Customer_WithOutputParameter(
IN _FirstName character varying DEFAULT NULL::character varying,
IN _LastName character varying DEFAULT NULL::character varying,
OUT _CustomerID integer)
RETURNS integer as
$BODY$
BEGIN
INSERT INTO Customers (FirstName, LastName) VALUES (_FirstName, _LastName); SELECT _CustomerID = lastval(); END
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;

Here is the code:

[Test]
public void ExecuteNonQuerySproc()
{
NpgsqlConnection conn = new NpgsqlConnection("Host=localhost; Database=postgres; User ID=postgres; Password=password");
conn.Open();
IDbCommand command = conn.CreateCommand();
command.CommandText = "Insert_Customer_WithOutputParameter";
command.CommandType = CommandType.StoredProcedure;
command.Parameters.Add(new NpgsqlParameter("@FirstName", "John"));
command.Parameters.Add(new NpgsqlParameter("@LastName", "Smith"));
NpgsqlParameter outParm = new NpgsqlParameter("@CustomerID", NpgsqlDbType.Integer)
{
Direction = ParameterDirection.Output
};
command.Parameters.Add(outParm); command.ExecuteNonQuery();
conn.Close();
Console.WriteLine(outParm.Value);
}

Here is the error message I am getting: Npgsql.NpgsqlException : ERROR: 42601: query has no destination for result data

The following doesn't work:

SELECT _CustomerID = lastval();

Replace it with a simple:

_CustomerID = lastval();

Note that Npgsql currently binds parameters by position only, and not by name. This means that the names you give in the NpgsqlParameter instances mean nothing - their order of addition must correspond to the function's declaration. Npgsql 3.1 will support named binding of function arguments (see this issue).

修改前:

-- Function: sp_updatesecurity(integer, character, character, character, character, integer, integer, character, integer)

-- DROP FUNCTION sp_updatesecurity(integer, character, character, character, character, integer, integer, character, integer);

CREATE OR REPLACE FUNCTION sp_updatesecurity(
OUT sqlcode_out integer,
IN parastaffid integer,
IN parafunctioncode character,
IN paraviewflag character,
IN paramodifyflag character,
IN paraadvanceflag character,
IN paralocalversion integer,
IN original_staffid integer,
IN original_functioncode character,
IN original_localversion integer)
RETURNS integer AS
$BODY$
DECLARE SQLCODE_OUT_TMP INT DEFAULT 0;
begin
IF (paraVIEWFLAG IS NULL) OR ((paraVIEWFLAG <> '') AND (paraVIEWFLAG <> '')) THEN
set SQLCODE_OUT_TMP = -1;
END IF; IF (paraMODIFYFLAG IS NULL) OR ((paraMODIFYFLAG <> '') AND (paraMODIFYFLAG <> '')) THEN
SET SQLCODE_OUT_TMP = -2;
END IF; IF (paraADVANCEFLAG IS NULL) OR ((paraADVANCEFLAG <> '') AND (paraADVANCEFLAG <> '')) THEN
SET SQLCODE_OUT_TMP = -3;
END IF; IF NOT EXISTS (SELECT *
FROM DMS.CM_STAFF
WHERE STAFFPKID = paraSTAFFID AND STATUS = '' AND (DELETED IS NULL OR DELETED = '')) THEN
SET SQLCODE_OUT_TMP = -4;
END IF; IF NOT EXISTS (SELECT *
FROM DMS.MM_FUNCTION
WHERE FUNCTIONCODE = paraFUNCTIONCODE ) THEN
SET SQLCODE_OUT_TMP = -5;
END IF; UPDATE DMS.MM_SECURITY
SET STAFFID = paraSTAFFID
, FUNCTIONCODE = paraFUNCTIONCODE
, VIEWFLAG = paraVIEWFLAG
, MODIFYFLAG = paraMODIFYFLAG
, ADVANCEFLAG = paraADVANCEFLAG
, INPUTTIME = CURRENT_TIMESTAMP
, LOCALVERSION = LOCALVERSION + 1
WHERE (STAFFID = original_STAFFID) AND (FUNCTIONCODE = original_FUNCTIONCODE) AND (LOCALVERSION = original_LOCALVERSION);
SELECT LOCALVERSION INTO paraLOCALVERSION FROM MM_SECURITY
WHERE (STAFFID = paraSTAFFID) AND (FUNCTIONCODE = paraFUNCTIONCODE);
SELECT SQLCODE_OUT_TMP; end
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
ALTER FUNCTION sp_updatesecurity(integer, character, character, character, character, integer, integer, character, integer)
OWNER TO postgres;

修改后:

-- Function: sp_updatesecurity(integer, character, character, character, character, integer, integer, character, integer)

-- DROP FUNCTION sp_updatesecurity(integer, character, character, character, character, integer, integer, character, integer);

CREATE OR REPLACE FUNCTION sp_updatesecurity(
OUT sqlcode_out integer,
IN parastaffid integer,
IN parafunctioncode character,
IN paraviewflag character,
IN paramodifyflag character,
IN paraadvanceflag character,
IN paralocalversion integer,
IN original_staffid integer,
IN original_functioncode character,
IN original_localversion integer)
RETURNS integer AS
$BODY$
DECLARE SQLCODE_OUT_TMP INT DEFAULT 0;
begin
IF (paraVIEWFLAG IS NULL) OR ((paraVIEWFLAG <> '') AND (paraVIEWFLAG <> '')) THEN
set SQLCODE_OUT_TMP = -1;
END IF; IF (paraMODIFYFLAG IS NULL) OR ((paraMODIFYFLAG <> '') AND (paraMODIFYFLAG <> '')) THEN
SET SQLCODE_OUT_TMP = -2;
END IF; IF (paraADVANCEFLAG IS NULL) OR ((paraADVANCEFLAG <> '') AND (paraADVANCEFLAG <> '')) THEN
SET SQLCODE_OUT_TMP = -3;
END IF; IF NOT EXISTS (SELECT *
FROM DMS.CM_STAFF
WHERE STAFFPKID = paraSTAFFID AND STATUS = '' AND (DELETED IS NULL OR DELETED = '')) THEN
SET SQLCODE_OUT_TMP = -4;
END IF; IF NOT EXISTS (SELECT *
FROM DMS.MM_FUNCTION
WHERE FUNCTIONCODE = paraFUNCTIONCODE ) THEN
SET SQLCODE_OUT_TMP = -5;
END IF; UPDATE DMS.MM_SECURITY
SET STAFFID = paraSTAFFID
, FUNCTIONCODE = paraFUNCTIONCODE
, VIEWFLAG = paraVIEWFLAG
, MODIFYFLAG = paraMODIFYFLAG
, ADVANCEFLAG = paraADVANCEFLAG
, INPUTTIME = CURRENT_TIMESTAMP
, LOCALVERSION = LOCALVERSION + 1
WHERE (STAFFID = original_STAFFID) AND (FUNCTIONCODE = original_FUNCTIONCODE) AND (LOCALVERSION = original_LOCALVERSION);
SELECT LOCALVERSION INTO paraLOCALVERSION FROM MM_SECURITY
WHERE (STAFFID = paraSTAFFID) AND (FUNCTIONCODE = paraFUNCTIONCODE);
sqlcode_out = SQLCODE_OUT_TMP; end
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
ALTER FUNCTION sp_updatesecurity(integer, character, character, character, character, integer, integer, character, integer)
OWNER TO postgres;

解决postgresql -- ERROR: 42601: query has no destination for result data的更多相关文章

  1. POSTGRESQL中ERROR: recursive query "t" column 2 has type character varying(150) in non-recursive term but type character varying overall

    最近在做项目的时候有个需求是需要查到当前登录的用户下辖所有区域的数据,并将查询出来的部门信息以如下格式展示 最高人民法院>江苏省高级人民法院>南通市中级人民法院最高人民法院>江苏省高 ...

  2. ERROR: No query specified

    mysql中执行show命令的时候,提示以下信息: mysql> show variables like 'datadir'\G; *************************** 1. ...

  3. 工作日志,error parsing query: unable to find time zone

    工作日志,error parsing query: unable to find time zone 坑 Windows 系统使用influxdb数据库,在执行查询语句时提示 ERR: error p ...

  4. influxdb ERR: error parsing query: found -, expected

    ERR: error parsing query: found -, expected 使用时遇到这个问题,执行语句: select * FROM test10-cc-core01 本来以为和sql语 ...

  5. MySQL查询报错 ERROR: No query specified

    今天1网友,查询报错ERROR: No query specified,随后它发来截图. root case:查询语法错误 \G后面不能再加分号;,由于\G在功能上等同于;,假设加了分号,那么就是;; ...

  6. 解决Unknown error: Unable to build: the file dx.jar was not loaded from the SDK folder!

    解决Unknown error: to the dx.jar the SDK folder!最近渐渐迁移到Android Studio来了,更新过Android SDK Manager里的东西后,打开 ...

  7. presto——java.sql.SQLException: Error executing query与javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection?异常问题

    使用presto的时候以mysql为presto的数据源 安装的presto是0.95版本:使用的presto-jdbc是0.202的,这里使用jdbc去访问时候,connection可以链接成功,但 ...

  8. ubuntu 16.04 + eigen3 安装(解决 fatal error: Eigen/Core: No such file or directory)

    1.安装 sudo apt-get install libeigen3-dev 2. 解决 fatal error: Eigen/Core: No such file or directory 当调用 ...

  9. ArcGIS Server 地图服务,查询出错 Error performing query operation

    Error: Error performing query operation Error Message Querying a layer from a Map Service that retur ...

随机推荐

  1. register_shutdown_function 函数详解

    设定错误和异常处理三函数 register_shutdown_function(array(‘Debug’,'fatalError’)); //定义PHP程序执行完成后执行的函数 set_error_ ...

  2. Split Array Largest Sum

    Given an array which consists of non-negative integers and an integer m, you can split the array int ...

  3. jq隐藏页面的一行

    <script type="text/javascript" src="http://files.cnblogs.com/914556495wxkj/jquery- ...

  4. ios swift generator 文章推荐

    https://medium.com/swift-programming/sequence-beyond-primitive-iterations-in-swift-80bc2507d8cc /// ...

  5. MongoDB 3.0 新特性【转】

    本文来自:http://www.open-open.com/lib/view/open1427078982824.html#_label3 更多信息见官网: http://docs.mongodb.o ...

  6. ffmpeg-20160731-bin.7z

    ESC 退出 0 进度条开关 1 屏幕原始大小 2 屏幕1/2大小 3 屏幕1/3大小 4 屏幕1/4大小 S 下一帧 [ -2秒 ] +2秒 ; -1秒 ' +1秒 下一个帧 -> -5秒 f ...

  7. stream的seek方法实例

    using (FileStream outStream = new FileStream(@"D:\12.txt", FileMode.Open)) { using (FileSt ...

  8. pycharm远程上传文件到Linux

    配置远程SFTP 1. 在PyCharm中打开SFTP配置面板,路径为Tools => Deployment => Configuration: 2. 配置Connection参数设置,填 ...

  9. java判断身份证有效性

    import java.util.Calendar; public class CertNoUtil { public static boolean vIDNumByRegex(String idNu ...

  10. Json数据报错

    在Json数据解析的时候报错,如下图: 这里的id,code,A1等等,都应该使用双引号,即:"id","code","A1",假如id后面 ...