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)
问题:
CREATE IF NOT EXISTS-type声明,所以我可以一遍又一遍地运行这个脚本,只有当它不存在时才会创建一次.会发生这种情况还是我需要更改语法才能完成IF NOT EXISTS?根据 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)
| 归档时间: |
|
| 查看次数: |
738 次 |
| 最近记录: |