如果您想要与名称 fo 对应的数字,则必须将其括在引号中,这反过来意味着您需要转义字符串中的引号。您需要阅读有关 SQL Injection 的信息,因为您提出的建议很容易受到 SQL 注入的影响。
如果练习的目的是执行显示的查询,那么你应该使用:
CREATE FUNCTION somefunction(stringval VARCHAR(32)) RETURNING INT;
DEFINE sp_id INTEGER;
SELECT FIRST 1 someid
INTO sp_id
FROM sometable
WHERE sname= stringval
ORDER BY somevalue;
RETURN sp_id;
END FUNCTION
如果练习的对象是使用动态 SQL,那么你应该考虑使用占位符,像这样:
CREATE FUNCTION somefunction(stringval VARCHAR(32)) RETURNING INT;
DEFINE sp_id INTEGER;
DEFINE c_query varchar(250);
LET c_query = 'SELECT FIRST 1 someid FROM sometable WHERE sname = ? ORDER BY somevalue';
PREPARE c_stmt FROM c_query;
DECLARE c_cur CURSOR FOR c_stmt;
OPEN c_cur USING stringval;
FETCH c_cur INTO sp_id;
CLOSE c_cur;
FREE c_cur;
FREE c_stmt;
RETURN sp_id;
END FUNCTION
在您的桌子上未经测试。我测试的代码是:
CREATE FUNCTION atomic_number(symbol VARCHAR(3)) RETURNING INTEGER;
DEFINE num INTEGER;
SELECT atomic_number INTO num FROM elements AS e WHERE e.symbol = symbol;
RETURN num;
END FUNCTION
和:
CREATE FUNCTION atomic_number(symbol VARCHAR(3)) RETURNING INTEGER;
DEFINE num INTEGER;
DEFINE c_query varchar(250);
LET c_query = 'SELECT FIRST 1 atomic_number FROM elements WHERE symbol = ? ORDER BY atomic_number';
PREPARE c_stmt FROM c_query;
DECLARE c_cur CURSOR FOR c_stmt;
OPEN c_cur USING symbol;
FETCH c_cur INTO num;
CLOSE c_cur;
FREE c_cur;
FREE c_stmt;
RETURN num;
END FUNCTION
这些针对“元素表”(如“周期表”),其结构:
CREATE TABLE elements
(
atomic_number INTEGER NOT NULL PRIMARY KEY
CHECK (atomic_number > 0 AND atomic_number < 120),
symbol CHAR(3) NOT NULL UNIQUE,
name CHAR(20) NOT NULL UNIQUE,
atomic_weight DECIMAL(8, 4) NOT NULL,
pt_period SMALLINT NOT NULL
CHECK (pt_period BETWEEN 1 AND 7),
pt_group CHAR(2) NOT NULL
-- 'L' for Lanthanoids, 'A' for Actinoids
CHECK (pt_group IN ('1', '2', 'L', 'A', '3', '4', '5', '6',
'7', '8', '9', '10', '11', '12', '13',
'14', '15', '16', '17', '18')),
stable CHAR(1) DEFAULT 'Y' NOT NULL
CHECK (stable IN ('Y', 'N'))
);
INSERT INTO elements VALUES( 1, 'H', 'Hydrogen', 1.0079, 1, '1', 'Y');
…
INSERT INTO elements VALUES(118, 'Og', 'Oganesson', 294.2100, 7, '18', 'N');