假设我有一个包含下表的Oracle 11.2数据库:
TABLE: SURVEY
PARAMETER MALE FEMALE
--------------------------
SAMPLE_SIZE 102 95
AVG_WEIGHT 170 120
AVG_HEIGHT 5.9 5.4
Run Code Online (Sandbox Code Playgroud)
这是一个示例最小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;
Run Code Online (Sandbox Code Playgroud)
请注意,IN参数gender
在此处不执行任何操作.我想要的是传入变量gender
,它可能等于"男性"或"女性",并且gender
在SELECT语句中使用某种方式(而不是"男性").目标是gender
作为可用于返回的变量传入,例如,男性或女性的平均重量,如gender
.
我知道我可以使用带有两个单独的SELECT语句的IF/THEN/ELSE语句,但是我想知道是否有一种优雅的方法可以通过将上面的SELECT语句中的'male'更改为其他语句来使用一个SELECT语句?
请注意,这是我之前提出的问题
那是(正确地)批评不是一个现实的问题.
您需要使用与其他问题中建议的相同的动态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;
Run Code Online (Sandbox Code Playgroud)
但是你在前面的问题中提出了相同的一般性反对意见 - 数据模型存在根本缺陷.你会更好的服务具有独立的行MALE
和FEMALE
调查结果,而不是单独的列male
和female
结果.