加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

PostgreSQL使用显式数据类型声明变量

发布时间:2020-12-13 16:00:10 所属栏目:百科 来源:网络整理
导读:我已经阅读了文档和几篇SO帖子,但仍然感觉不清楚如何在Postgres中声明和分配变量…这是我最初尝试做的事情: SET SEARCH_PATH = PsychoProductions;declare var_person_id INT;select var_person_id = ( select id from person where first_name = prm_first
我已经阅读了文档和几篇SO帖子,但仍然感觉不清楚如何在Postgres中声明和分配变量…这是我最初尝试做的事情:

SET SEARCH_PATH = PsychoProductions;
declare var_person_id   INT;
select var_person_id = (
        select id 
        from person 
        where 
                first_name = prm_first_name AND
                last_name = prm_last_name AND
                organization = prm_organization
        );
/* 
Result:
ERROR:  syntax error at or near "INT"
LINE 2:     DECLARE var_person_id   INT;
                                    ^

********** Error **********

ERROR: syntax error at or near "INT"
SQL state: 42601
Character: 70
*/

这很简单,但它不起作用……我在Postgres语法方面有点新意,我希望得到一些帮助来解决这个问题,因为我希望在设置数据之前显式声明数据类型(如果可能)变量.

你们中的任何人都知道在设置变量时明确声明数据类型我缺少什么吗?

编辑1:09-05-2013

有些人指出变量必须在函数中使用.我不相信Postgres的情况完全如此(我知道它与MySQL有关,而不是T-SQL)但是到目前为止,这里是上面的代码,在函数的上下文中.我将在短期内测试一个答案中指出的内容,并据此接受.所以这是目前为止的完整代码:

set search_path = PsychoProductions;
create or replace function fcn_Insert_person (
        -- "person" table
        prm_role_id             text,-- table default 'Customer'
        prm_first_name          text,prm_last_name           text,prm_organization        text,prm_website             text,prm_default_Billing_Method_ID   text,-- table default 'Net 30'
        prm_active              BOOLEAN,-- "address" table
        prm_address_type_id     text,-- table default 'Unique'
        prm_address             text,prm_city                text,prm_state               text,prm_zip_code            text,-- "email" table
        prm_email_address       text,prm_email_type_id       text,-- table default 'Business'
        -- "phone" table
        prm_phone_number        text,prm_phone_type_id       text  -- table default 'Main'
        ) 
        returns setof Person 
as

$delimiter$

begin
set search_patch = PsychoProductions;
start transaction;
insert into person (
        role_id,first_name,last_name,organization,website,default_billing_method_id,active
        )
values (
        prm_role_id,prm_first_name,prm_last_name,prm_organization,prm_website,prm_default_Billing_Method_ID,prm_active
        );
commit; 

start transaction;
declare var_person_id   int;
select var_person_id = (
        select id 
        from person 
        where 
                first_name = prm_first_name AND
                last_name = prm_last_name AND
                organization = prm_organization
        );
-- and this is where I got stuck

编辑2:09-06-2013

我使用select into myVar …语法,但现在我遇到了一个完全不同的问题……我应该问一个新问题吗?

错误:

ERROR:  column "var_person_id" does not exist
LINE 81:         var_person_id,^
********** Error **********

ERROR: column "var_person_id" does not exist
SQL state: 42703
Character: 2220

码:

start transaction;
-- declare var_person_id   int;
select id into var_person_id 
        from person 
        where 
                first_name = prm_first_name AND
                last_name = prm_last_name AND
                organization = prm_organization;

insert into address (
        person_id,address_type_id,address,city,state,zip_code
        )
values (
        var_person_id,-- error here
        prm_address_type_id,prm_address,prm_city,prm_state,per_zip_code
        );

解决方法

您只能在函数(存储过程)中声明变量.尝试这样的事情:

CREATE FUNCTION my_func(prm_first_name text,prm_last_name text) 
RETURNS SET OF int $$
DECLARE
    var_person_id int;
BEGIN
    SELECT id INTO var_person_id
        FROM person,var_parameter
        WHERE first_name = prm_first_name 
        AND last_name = prm_last_name
        AND organization = prm_organization;

    -- OR

    var_person_id := (SELECT id FROM ...);

    -- use it later like this:

    RETURN QUERY SELECT ... FROM ... WHERE id=var_person_id;
END;
$$LANGUAGE PLPGSQL;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读