假设我有一个包含下表的 Oracle 11.2 数据库:
TABLE: SURVEY
PARAMETER MALE FEMALE
--------------------------
SAMPLE_SIZE 102 95
AVG_WEIGHT 170 120
AVG_HEIGHT 5.9 5.4
这是一个最小的 PL/SQL 存储过程示例,它选择男性的平均体重并将其(例如 170)放入变量 v_stat
。
PROCEDURE get_stat (gender IN VARCHAR2)
AS
v_stat number;
BEGIN
SELECT male INTO v_stat FROM survey WHERE parameter = 'avg_weight';
END get_stat;
注意 IN 参数 gender
在这里没有做任何事情。我想要的是传入变量 gender
,它可能等于“男性”或“女性”,并在 SELECT 语句中以某种方式使用 gender
(而不是“男性” ).目标是将 gender
作为可用于返回的变量传递,例如,由 gender
定义的男性或女性的平均体重。
我知道我可能可以将 IF/THEN/ELSE 语句与两个单独的 SELECT 语句一起使用,但我想知道是否有一种优雅的方法可以通过将上述 SELECT 语句中的“男性”更改为其他内容来仅使用一个 SELECT 语句?
请注意,这是我之前问题的重做
How to programmatically set table name in PL/SQL?
这被(正确地)批评为不是一个现实的问题。
最佳答案
您需要使用其他问题中建议的相同动态 SQL 方法
PROCEDURE get_stat (gender IN VARCHAR2)
AS
v_sql varchar2(1000);
v_param varchar2(100) := 'AVG_WEIGHT';
v_stat number;
BEGIN
v_sql := 'SELECT ' || gender || ' FROM survey WHERE parameter = :1';
EXECUTE IMMEDIATE v_sql
INTO v_stat
USING v_param;
END get_stat;
但是您会遇到与您之前的问题中提出的相同的普遍反对意见——数据模型存在根本性缺陷。为 MALE
和 FEMALE
调查结果单独一行,而不是为 male
和 female< 单独列,这样会更好
结果。
关于oracle - PL/SQL : re-write SELECT statement using IN parameter in stored procedure,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9959799/