将pgsql变量导入VB参数函数

时间:2017-02-07 12:07:12

标签: vba postgresql plpgsql

我在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.我该怎么做?

3 个答案:

答案 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;