微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用动态 SQL 创建过程

如何解决使用动态 SQL 创建过程

以下是说明:

一家公司希望允许客户通过选择产品名称或 描述,然后键入搜索词。使用本机动态 sql,创建一个 返回产品名称、描述和价格基础的过程名称 SEARCH_SP 关于用户搜索条件。该过程需要处理返回的多行。

这是我目前的代码

CREATE OR REPLACE PROCEDURE search_sp (product_name IN VARCHAR2,description IN VARCHAR2,price_based IN NUMBER             
                                        )
AS

BEGIN
    SELECT customer.product.name,customer.description,customer.price
    FROM dbo.customer
    WHERE customer.description = @SEARCH.customer.product.name = @SEARCH
END;
/

EXECUTE IMMEDIATE plsql_block
    USING IN OUT new_product_name,new_description,new_price_based;
    
END;
/

我遇到了编译错误等等。任何帮助或建议将不胜感激。

解决方法

动态 SQL?做什么的?让你的生活比它应该的更悲惨? 直接 SQL 有什么问题?

我建议使用功能。为什么?你应该返回结果。如果它是一个过程,它必须有一个 library(dplyr) library(tibble) iris %>% .[which(as.numeric(rownames(.))%%3!=0),] %>% # store rownames in a column rownames_to_column(var = "rowid") %>% # dplyr manipulation mutate(Sepal.Length=Sepal.Length+1) %>% # reinstate rownames column_to_rownames(var = "rowid") %>% # check rownames rownames() # [1] "1" "2" "4" "5" "7" "8" "10" "11" "13" "14" "16" "17" "19" "20" "22" "23" "25" "26" "28" "29" "31" "32" "34" "35" "37" "38" # [27] "40" "41" "43" "44" "46" "47" "49" "50" "52" "53" "55" "56" "58" "59" "61" "62" "64" "65" "67" "68" "70" "71" "73" "74" "76" "77" # [53] "79" "80" "82" "83" "85" "86" "88" "89" "91" "92" "94" "95" "97" "98" "100" "101" "103" "104" "106" "107" "109" "110" "112" "113" "115" "116" # [79] "118" "119" "121" "122" "124" "125" "127" "128" "130" "131" "133" "134" "136" "137" "139" "140" "142" "143" "145" "146" "148" "149" 参数。如果是这样,那么它就是一个函数。

这是我的做法;看看它是如何工作的,如果需要,可以使用它(并改进)。我不认为我会参与任何动态的事情,抱歉。


由于我没有您的表,我将使用 Scott 的示例架构。以下是我感兴趣的数据:

OUT

搜索它的代码如下所示:

SQL> select d.dname,e.ename,e.job,e.sal
  2    from dept d join emp e on e.deptno = d.deptno
  3    order by d.dname,e.sal;

DNAME          ENAME      JOB              SAL
-------------- ---------- --------- ----------
ACCOUNTING     MILLER     CLERK           1300
ACCOUNTING     CLARK      MANAGER         2450
ACCOUNTING     KING       PRESIDENT       5000
RESEARCH       SCOTT      ANALYST         3000
RESEARCH       FORD       ANALYST         3000
RESEARCH       SMITH      CLERK            800
RESEARCH       ADAMS      CLERK           1100
RESEARCH       JONES      MANAGER         2975
SALES          JAMES      CLERK            950
SALES          BLAKE      MANAGER         2850
SALES          MARTIN     SALESMAN        1250   --> for testing,I'll fetch SALESMEN
SALES          WARD       SALESMAN        1250   --> who earn 1250 USD (it's probably USD)
SALES          TURNER     SALESMAN        1500
SALES          ALLEN      SALESMAN        1600

14 rows selected.

让我们测试一下:

SQL> create or replace function search_sp
  2    (par_dname in varchar2,3     par_job   in varchar2,4     par_sal   in number
  5    )
  6    return sys_refcursor
  7  is
  8    rc sys_refcursor;
  9  begin
 10    open rc for
 11      select d.dname,e.sal
 12        from dept d join emp e on e.deptno = d.deptno
 13        where (d.dname = par_dname or par_dname is null)
 14          and (e.job   = par_job   or par_job   is null)
 15          and (e.sal   = par_sal   or par_sal   is null);
 16    return rc;
 17  end;
 18  /

Function created.

我觉得还行。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。