我一直在尝试使用代码来查找表中元素的数量并将其存储在局部变量中。我基本上只想检查记录的存在,所以如果有更简单的方法可以做到这一点。
以下是我在变量(link)中存储查询结果的示例:
CREATE FUNCTION checklist( d SMALLINT )
RETURNING VARCHAR(30), VARCHAR(12), INTEGER;
DEFINE name VARCHAR(30);
DEFINE dept VARCHAR(12);
DEFINE num INTEGER;
SELECT mgr_name, department,
CARDINALITY(direct_reports)
FROM manager INTO name, dept, num
WHERE dept_no = d;
IF num > 20 THEN
EXECUTE FUNCTION add_mgr(dept);
ELIF num = 0 THEN
EXECUTE FUNCTION del_mgr(dept);
ELSE
RETURN name, dept, num;
END IF;
END FUNCTION;
但是当我尝试创建自己的版本时,我收到语法错误。我不知道问题是什么。
CREATE FUNCTION test ()
RETURNING INTEGER AS num1;
DEFINE l_count INTEGER;
CREATE TEMP TABLE t_queued_calls (
session_id DEC(18,0) PRIMARY KEY,
calling_number NVARCHAR(50)
) WITH NO LOG;
INSERT INTO t_queued_calls VALUES (123456, '5555555555');
SELECT COUNT(*) FROM t_queued_calls INTO l_count WHERE session_id = 123456;
DROP TABLE t_queued_calls;
END FUNCTION;
答案 0 :(得分:4)
INTO
子句的位置在两个函数中都是错误的。 INTO子句位于 select-list (关键字SELECT之后的表达式列表)之后和FROM子句之前(参见Informix" SQL指南:语法"手册中的SELECT声明),如下代码所示:
CREATE PROCEDURE test()
RETURNING INTEGER AS num1;
DEFINE l_count INTEGER;
CREATE TEMP TABLE t_queued_calls (
session_id DEC(18,0) PRIMARY KEY,
calling_number NVARCHAR(50)
) WITH NO LOG;
INSERT INTO t_queued_calls VALUES (123456, '5555555555');
SELECT COUNT(*) INTO l_count FROM t_queued_calls WHERE session_id = 123456;
DROP TABLE t_queued_calls;
RETURN l_count;
END PROCEDURE;
此外,问题中显示的第一个函数与子句的排序具有相同的问题。此外,它并不总是RETURN一个值,第二个函数的原始版本永远不会返回一个值(虽然它会说它会。)
答案 1 :(得分:1)
可能与插入没有列名
的事实有关将your_column1,your_column2改编为表格架构
INSERT INTO t_queued_calls (your_column1, your_column2) VALUES (123456, '5555555555');
SELECT COUNT(*) FROM t_queued_calls INTO l_count WHERE session_id = 123456;
和/或select中的列数与insertt中的数字和类型不匹配...你只选择un field但是插入两个字段
并选择进入奇怪的选择格式...通常是插入但是选择不使用into子句
答案 2 :(得分:0)
我从这个问题找到了正确的语法:[Use MERGE statement in a stored procedure with Informix
SELECT COUNT(*) INTO l_count FROM t_queued_calls WHERE session_id = 123456;