【问题标题】:How to set a variable and use it in a select query in Oracle PL/SQL?如何设置变量并在 Oracle PL/SQL 的选择查询中使用它?
【发布时间】:2021-06-25 00:18:39
【问题描述】:

我如何在 oracle SQL 开发人员中做这样的事情?

DECLARE
    p_name products.product_name%TYPE;
BEGIN
    p_name := 'Strawberry';
   SELECT * FROM products WHERE product_name = p_name;
END;

【问题讨论】:

    标签: oracle plsql


    【解决方案1】:

    您需要在某处给出 SELECT 语句以放置查询结果:

    DECLARE
      p_name VARCHAR2(100);
      aProducts_row  PRODUCTS%ROWTYPE;
    BEGIN
      p_name := 'Strawberry';
    
      SELECT *
        INTO aProducts_row
        FROM products
        where product_name=p_name;
    
      -- Add code to manipulate data in aProducts_row here, as in...
    
      DBMS_OUTPUT.PUT_LINE('PRODUCT_NAME = ''' ||
                              aProducts_row.PRODUCT_NAME || '''');
    END;
    

    或者,如果您希望返回多行,您可以使用游标:

    DECLARE
      p_name VARCHAR2(100);
    BEGIN
      p_name := 'Strawberry';
    
      FOR aProducts_row IN (SELECT *
                              FROM products
                              where product_name=p_name)
      LOOP
        -- Add code to manipulate data in aProducts_row here, as in...
    
        DBMS_OUTPUT.PUT_LINE('PRODUCT_NAME = ''' ||
                               aProducts_row.PRODUCT_NAME || '''');
      END LOOP;
    END;
    

    【讨论】:

    • 为什么 T SQL 这么简单,PL/SQL 这么复杂?
    • T-SQL 和 PL/SQL 使用不同的模型来实现相同的目标。 SELECT...INTO 存在于两种语言中,尽管语法略有不同。你到底想完成什么?
    • @developer747 SQL Server 允许在单个命令中运行多个语句(这会导致 SQL 注入漏洞); Oracle 只允许在每个命令中使用一个语句(这仍然允许一些 SQL 注入漏洞,但会关闭其中的许多漏洞 - this xkcd 在 Oracle 中不起作用)。这种限制和其他差异意味着他们对待你所做的事情略有不同(毕竟它们是不同的语言)。
    • @BobJarvis-ReinstateMonica 我认为 developer747 想要以某种方式返回结果集,这样该块的作用类似于 Oracle 中的查询/视图/表宏。根据我对 SQL Server 的有限理解,T-SQL 可以做到这一点,因为它比 PL/SQL 更像是一种脚本语言。
    • @developer747:我想这是一个完美的例子,说明先学后才能学得最好。对我来说,T-SQL 似乎你只是抛出一些东西并希望最好。困难且完全没有结构。
    【解决方案2】:

    使用光标:

    DECLARE
        p_name VARCHAR2(100);
        p_cur  SYS_REFCURSOR;
    BEGIN
        p_name := 'Strawberry';
        OPEN p_cur FOR
        SELECT * FROM products where product_name=p_name;
    
        -- do something with the cursor.
    END;
    /
    

    或者使用 SQL/Plus 风格的绑定变量声明:

    VARIABLE p_name VARCHAR2;
    
    BEGIN
      :p_name := 'Strawberry';
    END;
    /
    
    SELECT * FROM products where product_name=:p_name;
    

    如果您的查询只返回一行(即product_nameUNIQUE),那么您可以使用SELECT ... INTO ...

    DECLARE
        p_name   VARCHAR2(100);
        p_value1 products.value1%TYPE;
        p_value2 products.value2%TYPE;
        p_value3 products.value3%TYPE;
    BEGIN
        p_name := 'Strawberry';
    
        SELECT value1, value2, value3
        INTO   p_value1, p_value2, p_value3
        FROM   products
        WHERE  product_name=p_name;
    
        -- do something with the values.
    EXCEPTION
      WHEN NO_DATA_FOUND THEN
        NULL;
        -- Handle the exception
      WHEN TOO_MANY_ROWS THEN
        NULL;
        -- Handle the exception
    END;
    /
    

    【讨论】:

      【解决方案3】:

      如果问题不是关于设置变量,而实际上是关于 PL/SQL 匿名块的输出,那么它已经回答了 here

      declare
          rc sys_refcursor;
      begin
          open rc for select 'Hello' as test from dual;
          dbms_sql.return_result(rc);
      end;
      

      您可以使用普通的PL/SQL assignment syntax 设置您想要的任何变量。如果文档的某些部分不清楚,请提供一个您正在尝试做的示例。

      【讨论】:

        猜你喜欢
        • 2016-08-28
        • 1970-01-01
        • 2020-02-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-09
        • 1970-01-01
        相关资源
        最近更新 更多