我在VB中有这个代码,我打开与数据库的连接并连接到我的pgsql函数..
Set oCmd = New ADODB.Command
oCmd.ActiveConnection = GetConnectionString
oCmd.CommandType = adCmdStoredProc
oCmd.CommandTimeout = 36000
oCmd.Parameters.Append oCmd.CreateParameter("lngUserId", adInteger, adParamOutput)
oCmd.CommandText = "P_Login"
oCmd.Execute
g_USRid = oCmd.Parameters("lngUserId")
在我的pgsql函数中,我有这个:
CREATE OR REPLACE FUNCTION p_login(
OUT lnguserid bigint) RETURNS record AS
$BODY$
DECLARE
BEGIN
--Select USR_Id into lngUserID From tbl_User Where USR_Login = strLogin;
lngUserID := 369;
END;
$BODY$
LANGUAGE plpgsql VOLATILE SECURITY DEFINER
COST 100;
问题是我的变量g_USRid
没有得到值369.我该怎么做?
答案 0 :(得分:0)
您不能同时只使用一个OUT和RETURNS记录。
可能是:
CREATE OR REPLACE FUNCTION p_login(OUT lnguserid bigint)
或
CREATE OR REPLACE FUNCTION p_login() RETURNS bigint
修复版本的功能(来自评论)
CREATE OR REPLACE FUNCTION p_login(
IN strlogin varchar,
IN strpassword varchar,
OUT "lngUserId" bigint,
OUT stroraclelogin varchar,
OUT stroraclepassword varchar,
OUT lngprofile bigint,
OUT interror bigint)
RETURNS record AS $BODY$ Declare
begin --Select USR_Id into lngUserID From tbl_User Where USR_Login = strLogin;
lngUserID := 369;
end; $BODY$
LANGUAGE plpgsql VOLATILE SECURITY DEFINER COST 100;
SELECT * FROM p_login('1','1');
lnguserid | stroraclelogin | stroraclepassword | lngprofile | interror
-----------+----------------+-------------------+------------+----------
369 | | | |
(1 row)
错误:
1)postgr4esql没有varchar2,只有varchar
2)两次RETURNS record RETURNS record
要访问结果使用:
设置rst = cmd.Execute MsgBox rst.Fields(1).Value
答案 1 :(得分:0)
您的功能存在一些问题。最重要的是,您不应该返回record
而只返回您感兴趣的值。此外,您可以使用更高效的sql
语言函数。最后,函数不应该是VOLATILE
(它不会改变数据库中的任何内容,也不依赖于当前时间之类的变化因素),而是STRICT
(需要指定参数来调用函数) )。试试这个:
CREATE FUNCTION p_login(strLogin text) RETURNS bigint AS $BODY$
SELECT USR_Id FROM tbl_User WHERE USR_Login = strLogin;
$BODY$ LANGUAGE sql STRICT;
请注意,在调用函数之前,必须在VB中设置参数strLogin
。
答案 2 :(得分:0)
这是函数的构造方式:
CREATE OR REPLACE FUNCTION p_login(
IN strlogin varchar2,
IN strpassword varchar2,
OUT lnguserid bigint,
OUT stroraclelogin varchar2,
OUT stroraclepassword varchar2,
OUT lngprofile bigint,
OUT interror bigint)
RETURNS record AS
$BODY$
Declare
begin
--Select USR_Id into lngUserID From tbl_User Where USR_Login = strLogin;
lngUserID := 369;
end;
$BODY$
LANGUAGE plpgsql VOLATILE SECURITY DEFINER
COST 100;