You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

PostgreSQL存储过程插入数据调用报错问题求助

排查并解决PostgreSQL存储过程调用的语法错误

嘿,我来帮你一步步揪出问题并搞定它~首先你遇到的ERROR: syntax error at or near "Fast"是个典型的语法小失误,不过咱们顺便把存储过程里的隐藏坑也填上,省得后面再踩雷。

1. 直接触发报错的原因:CALL语句的两个低级失误

先看你写的调用语句:

CALL customer('s12',James','Fast','12 ways','07988654564','2022-12-07','HSBC','35 bank way M8 3AB','040021',10204312)

这里有两个一眼就能看到的问题:

  • 字符串没加单引号James前面少了一个单引号!SQL里字符串必须用单引号包裹,你写成James的话,PostgreSQL会把它当成一个标识符(比如表名、字段名),自然就会在后面的Fast位置报错,因为它完全看不懂这个语法。
  • 调用错对象了:你要调用的是你创建的存储过程register_newcustomer,不是customer表啊!CALL是用来调用存储过程/函数的,不能直接CALL表,所以得把目标改成sse_schema.register_newcustomer(如果当前会话的schema不是sse_schema,最好带上前缀,避免找不到对象)。

2. 存储过程里的隐藏坑:字段名写错了

除了调用语句的问题,你的存储过程里还有个容易忽略的错误:

INSERT INTO customer (..., account_number) 
VALUES(..., account_number);

但你创建的customer表里,对应的字段明明是account_no,不是account_number!这个问题现在没报错,但等你把调用语句改对后,肯定会触发“字段不存在”的错误,所以咱们提前把它修正。

3. 修复后的完整代码

修正后的存储过程

CREATE OR REPLACE PROCEDURE sse_schema.register_newcustomer(
    customer_id varchar(3), 
    customer_Sname varchar(20),
    customer_Fname varchar(20), 
    customer_address varchar(150),
    phone_number varchar (15),
    dob date,
    bank_name varchar(30),
    bank_address varchar(150),
    bank_sortcode varchar(8),
    account_no integer
) AS $$ 
BEGIN 
    INSERT INTO sse_schema.customer (
        customer_id,
        customer_Sname,
        customer_Fname,
        customer_address,
        phone_number,
        dob,
        bank_name,
        bank_address,
        bank_sortcode,
        account_no  -- 这里改成表中实际的字段名
    ) 
    VALUES(
        customer_id,
        customer_Sname,
        customer_Fname,
        customer_address,
        phone_number,
        dob,
        bank_name,
        bank_address,
        bank_sortcode,
        account_no
    ); 
END; $$ LANGUAGE plpgsql;

修正后的调用语句

CALL sse_schema.register_newcustomer(
    's12',
    'James',  -- 补上缺失的单引号
    'Fast',
    '12 ways',
    '07988654564',
    '2022-12-07',
    'HSBC',
    '35 bank way M8 3AB',
    '040021',
    10204312
);

4. 给你提几个小建议

  • 调用存储过程/函数时,尽量带上schema前缀(比如sse_schema.),避免因为当前会话的search_path设置问题找不到对象。
  • 写INSERT语句时,像你这样显式列出所有字段真的很棒,能避免字段顺序变化或者新增字段带来的问题,继续保持~
  • 字符串类型的参数必须用单引号包裹,这是SQL的基础规则,下次可别忘了哦😉

内容的提问来源于stack exchange,提问作者JonWay

火山引擎 最新活动