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. Servlet的使用方法详细说明

    Servlet的生命周期方法: init() destroy() doGet(HttpServletRequest request,HttpServletResponse response) 客户端请 ...

  2. 嵌套div中margin-top转移问题的解决办法

    在这两个浏览器中,有两个嵌套关系的div,如果外层div的父元素padding值为0,那么内层div的margin-top或者margin-bottom的值会“转移”给外层div. <!DOCT ...

  3. ip netns相关命令

    1.增加虚拟网络命名空间   ip netns add net0   2.显示所有的虚拟网络命名空间 EULER:~ # ip netns list net0 也可通过查看/var/run/netns ...

  4. js日期、月份:日期加一天等

    // 日期,在原有日期基础上,增加days天数,默认增加1天 function addDate(date, days) { if (days == undefined || days == '') { ...

  5. redis 异常解决办法

    redis 异常解决办法 26069:M 08 Aug 17:06:58.858 # WARNING: The TCP backlog setting of 511 cannot be enforce ...

  6. NGUI Table页(UIToggle和UIToggledObjects)

    1.添加两个按钮Btn1和Btn2.添加2个Spr1和Spr2 2.给每个Btn添加两个脚本UIToggle和UIToggledObjects 3.将每个UIToggle的Group设置个非0的值 4 ...

  7. 进程&线程 同步异步&阻塞非阻塞

    2015-08-19 15:23:38 周三 线程 线程安全 如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码 线程安全问题都是由全局变量及静态变量引起的 若每个线程中对 ...

  8. DataTemplate应用

    在WPF中,决定数据外观的是DataTemplate,即DataTemplate是数据内容的表现形式,一条数据显示成什么样子,是简单的文本还是直观的图形,就是由DataTemplate决定的.下面通过 ...

  9. ALV 输入数据时数字缩小一千倍的问题解决

    这个字段后面有三位小数  我输入 1 一回车 就变成了0.001 了 解决方法 DATA: wa_fieldcatalog    TYPE lvc_s_fcat,    "显示数据列内表工作 ...

  10. BM算法和Sunday快速字符串匹配算法

    BM算法研究了很久了,说实话BM算法的资料还是比较少的,之前找了个资料看了,还是觉得有点生涩难懂,找了篇更好的和算法更好的,总算是把BM算法搞懂了. 1977年,Robert S.Boyer和J St ...