Vba 将pgsql变量获取到VB参数函数中

Vba 将pgsql变量获取到VB参数函数中,vba,postgresql,plpgsql,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

我在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_登录”
执行
g_USRid=oCmd.Parameters(“lngUserId”)
在我的pgsql函数中,我有:


创建或替换函数p\u登录(
OUT lnguserid bigint)将记录返回为
$BODY$
声明
开始
--从tbl_用户中选择USR_Id进入lngUserID,其中USR_Login=strLogin;
lngUserID:=369;
结束;
$BODY$
语言plpgsql易失性安全定义程序
成本100;

问题是我的变量
g_USRid
没有得到值369。我该怎么做呢?

您不能只使用一个OUT并同时返回记录

可能是:

CREATE OR REPLACE FUNCTION p_login(OUT lnguserid bigint)

重新填充函数的版本(来自注释)

错误:

1) postgr4esql没有varchar2,只有varchar

2) 两次
返回记录返回记录

要访问结果使用,请执行以下操作:

设置rst=cmd.Execute
MsgBox rst.Fields(1.Value)

您的函数有一些问题。最重要的是,您不应该返回
记录
,而应该返回您感兴趣的值。此外,还可以使用效率更高的
sql
语言函数。最后,函数不应是
易失的(它不会改变数据库中的任何内容,也不取决于变化的因素,如当前时间),而应是严格的(需要指定参数才能调用函数)。试试这个:

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

函数就是这样构造的:

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;

这不能是VBScript,否则将出现
Microsoft VBScript运行时错误(1,1):未在
Set oCmd=New ADODB.Command
行上定义类:“ADODB”
。你确定这不是支持的VBA吗?编辑:刚刚实现标记,将添加回。我只是将其他参数删除到函数中,但函数中有更多参数,但不想将它们全部写入创建或替换函数p_login(在strlogin varchar2中,在strpassword varchar2中,在lnguserid bigint中,在stroraclelogin varchar2中,在stroraclepassword varchar2中,在lngprofile bigint中,在interor bigint中)返回记录作为$BODY$Declare begin返回记录作为$BODY$Declare begin——从tbl_用户中选择USR_Id进入lngUserID,其中USR_Login=strLogin;lngUserID:=369;end;$BODY$LANGUAGE plpgsql VOLATILE SECURITY DEFINER COST 100;我只想问另一个问题,而无需开始新的讨论……现在我正准备这样做,选择USR_Id进入lngUser来自tbl_用户的Id,其中USR_Login=strLogin;但它不起作用。我怎么做?看起来像普通的sqlcan你能在psql/pgadmin中运行:
从tbl_用户的lngUserId中选择USR_Id,其中USR_Login='some Login'
其中some Login是真正的用户登录?谢谢你的回答。“Select”语句在注释中。我只想找出h如何在我的VB代码中将'lngUserId'值转换为'g_userID'已更正,但仍然存在相同的问题…无法将'lngUserId'值转换为VB如果您想在PostgreSQL中使用区分大小写的对象名称,则必须使用“:“lngUserId”,或从program:oCmd.Parameters(“lngUserId”)中将其称为lngUserId我真的听不懂你说的话。请你给我举个例子,试试
oCmd.Parameters(“lnguserid”)
而不是
oCmd.Parameters(“lnguserid”)
,或者把函数中的参数名从
lnguserid
改为
“lnguserid”
让我们来看看。
CREATE FUNCTION p_login(strLogin text) RETURNS bigint AS $BODY$
   SELECT USR_Id FROM tbl_User WHERE USR_Login = strLogin;
$BODY$ LANGUAGE sql STRICT;
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;