HSQLDB存储过程错误:尝试分配给不可更新的列

IAm*_*aja 6 sql stored-procedures syntax-error hsqldb

我正在使用HSQLDB 2.3.2,并在尝试创建存储过程时遇到奇怪的错误.

我的addresses桌子:

CREATE TABLE IF NOT EXISTS addresses (
    address_id                  INTEGER GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1) NOT NULL PRIMARY KEY,
    address_line_1              NVARCHAR(500) NOT NULL,
    address_line_2              NVARCHAR(500),
    address_city                NVARCHAR(100) NOT NULL,
    address_postal_code         NVARCHAR(25) NOT NULL,

    CONSTRAINT uc_addresses UNIQUE (address_line_1, address_city)
)
Run Code Online (Sandbox Code Playgroud)

填充它的插入:

INSERT INTO addresses (
    address_line_1,
    address_city,
    address_postal_code
) VALUES (
    '123 Test Blvd.', 'Testville', '11111'
)
Run Code Online (Sandbox Code Playgroud)

我的过程:

CREATE PROCEDURE sp_get_address_by_id(
        IN address_id INTEGER,
        OUT address_id  INTEGER,
        OUT address_line_1 NVARCHAR(500),
        OUT address_line_2 NVARCHAR(500),
        OUT address_city NVARCHAR(100),
        OUT address_postal_code NVARCHAR(25))
    READS SQL DATA
    BEGIN ATOMIC
        SELECT
            a.address_id,
            a.address_line_1,
            a.address_line_2,
            a.address_city,
            a.address_postal_code
        INTO
            address_id,
            address_line_1,
            address_line_2,
            address_city,
            address_postal_code
        FROM
            addresses a 
        WHERE
            a.address_id = address_id;
    END
Run Code Online (Sandbox Code Playgroud)

当我运行这个时,我得到:

Error: attempt to assign to non-updatable column
SQLState:  0U000
ErrorCode: -2500
Run Code Online (Sandbox Code Playgroud)

问题:

  1. 我的proc有什么问题(产生这个错误是什么)?
  2. 我实际上正在寻找一个CREATE IF NOT EXISTS-type声明,所以我可以一遍又一遍地运行这个脚本,只有当它不存在时才会创建一次.会发生这种情况还是我需要更改语法才能完成IF NOT EXISTS

Bat*_*ech 3

根据 hsqldb 文档 http://hsqldb.org/doc/2.0/guide/sqlroutines-chapt.html#src_psm_assignment尝试以下语法

SET语句用于赋值。它可以灵活地与行或单个值一起使用。

还要更改address_id参数类型INOUT并删除重复的address_id参数行。

CREATE PROCEDURE sp_get_address_by_id(
    INOUT address_id INTEGER,
    OUT address_line_1 NVARCHAR(500),
    OUT address_line_2 NVARCHAR(500),
    OUT address_city NVARCHAR(100),
    OUT address_postal_code NVARCHAR(25))
READS SQL DATA
BEGIN ATOMIC
    SET (address_id,
        address_line_1,
        address_line_2,
        address_city,
        address_postal_code)
    = 
    (
    SELECT
        a.address_id,
        a.address_line_1,
        a.address_line_2,
        a.address_city,
        a.address_postal_code
    FROM
        addresses a 
    WHERE
        a.address_id = address_id
    );
END
Run Code Online (Sandbox Code Playgroud)

如果您想删除已存在的过程,则可以尝试将其添加为脚本中的第一个语句,以便可以多次重新运行该脚本。您可以搜索文档<specific routine designator>获取更多信息。

DROP SPECIFIC PROCEDURE sp_get_address_by_id IF EXISTS;
Run Code Online (Sandbox Code Playgroud)