【问题标题】:PostgreSQL stored proceduresPostgreSQL 存储过程
【发布时间】:2019-09-29 13:07:01
【问题描述】:

我是 PostgreSQL 新手。我有一个调用 PostgreSQL 数据库的 winforms 应用程序。 id 不是传入查询,而是使用 PostgreSQL 参数化存储过程。我能够全部并获得无参数存储过程的返回,但是当我添加参数并执行调用时,我收到一个错误,指出列 userId 不存在。

userid 是参数。

在 PostgreSQL 上,创建 sp 时,我还创建了一个 IN 参数,其名称和名称相同。

我在这里错过了什么?

sql很简单:

select * from public.users u where u.userid = userid.

【问题讨论】:

  • 尝试用_userId重命名Postgresql存储过程中的参数,它与表列冲突

标签: c# sql postgresql winforms


【解决方案1】:

用它来识别 SQL 中的参数:


Select * from public.users u where u.userid = @userid

【讨论】:

  • 您好,感谢您的回复,bvut 当我尝试这样做时,我在 postgres 上收到此错误:错误:运算符不存在:@ 字符变化第 4 行:...ODY$Select * from public。 users u where u.userid = @userid$BO... ^ 提示:没有运算符匹配给定的名称和参数类型。您可能需要添加显式类型转换
  • 我使用 postgres 创建存储过程并使用他们的向导工具来创建。我设置的唯一选项是在“常规”选项卡下 - 语言选项卡下的名称 - 语言 = SQL 在语言选项卡下 - 代码 = Select * from public.users u where u.userid = @userid 在参数选项卡下 - 数据type = character varying 在 Arguments 选项卡下 - Mode = IN 在 Arguments 选项卡下 - Argument Name = userid 当我调用这个 sp 时,我得到了错误,当我添加'@'时,我得到了我刚刚在上面的回复中提到的错误
【解决方案2】:

您表示您“创建一个具有相同 (t) 类型和名称的 IN 参数”。这不是你想要做的。虽然您确实希望类型相同,但名称必须不同或由函数名称限定。如果相同,您将获得所有行,因为预期的参数名称将被解释为列名称;基本上导致:

Select * from table_name where column_name = column_name;

只要值不为空,这就是真的。现在有两种方法,使用 userid 并假设其唯一性:

create or replace function get_user(userid_in users.userid%type)
returns setof users
language sql
as $$
    select *
      from users where userid = userid_in ; 
$$;

create or replace function get_user(userid users.userid%type)
returns setof users
language sql
as $$
    select *
      from users where userid = get_user.userid ; 
$$;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-05
    • 2015-03-13
    相关资源
    最近更新 更多