oracle - PL/SQL : re-write SELECT statement using IN parameter in stored procedure

标签 oracle plsql

假设我有一个包含下表的 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;

但是您会遇到与您之前的问题中提出的相同的普遍反对意见——数据模型存在根本性缺陷。为 MALEFEMALE 调查结果单独一行,而不是为 malefemale< 单独列,这样会更好 结果。

关于oracle - PL/SQL : re-write SELECT statement using IN parameter in stored procedure,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9959799/

相关文章:

oracle - 蟾蜍分割我的输出

mysql - PL/SQL 语法到 MySQL 语法

Oracle 导入转储文件抛出 ORA-39088 错误

sql - 用于检查一列是否包含另一列值的正则表达式

sql - oracle中有没有固定字符串长度的函数?

oracle - 在 Oracle 过程中运行 DDL - ORA-06508 - 如何在运行时重新编译?

xml - 如何在 Oracle 中查询带有命名空间的 XML?

java - Commons DBUtils Oracle 11g 准备语句

sql - Oracle - 沿间隔对值进行分组

oracle - 如何回滚 Oracle PL/SQL 调试 session (SQL Developer)