如何解决使用动态 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 举报,一经查实,本站将立刻删除。