sql - 为什么我尝试获取名称时功能不起作用?PL/SQL
问题描述
现在我在试用期,我的主管给了我这样的任务。虽然他知道我不懂PL/SQL
任务的本质:函数接收客户端的ID作为输入并返回名称。
此外,此代码需要优化。除了这段代码不起作用之外,还需要做些什么来优化它并使其起作用?
对不起一个可能愚蠢的问题。
目前我正在学习PL/SQL,但我的知识不足以理解这些功能。
没有约束和主键的表。
CREATE TABLE CUSTOMERS(CUSTOMER_ID NUMBER, CUSTOMER_NAME VARCHAR2(255));
CREATE OR REPLACE FUNCTION get_name(customer_id number)
return varchar2
as
result varchar2(50);
BEGIN
select customer_name
into result
from customers c
where c.customers_id = customers_id;
return result;
END;
对不起,我的英语不好。
解决方案
您编写的代码几乎可以。你犯了两个错误:
如果列名是
CUSTOMER_ID
,则不要将其引用为CUSTOMERS_ID
如果列名是
CUSTOMERS_ID
,则不要将函数的参数命名为相同,因为 - 当在WHERE
子句中使用时 - Oracle 无法区分什么是什么,所以这是:where customers_id = customers_id
变成
where 1 = 1
这不是你想要的。
这是一个展示如何做到这一点的例子;看看它是否有帮助。
样品表:
SQL> create table customers as select empno customers_id, ename customer_name
2 from emp
3 where deptno = 10;
Table created.
功能; 注意更改的参数名称:
SQL> CREATE OR REPLACE FUNCTION get_name(par_customers_id number)
2 return varchar2
3 as
4 result varchar2(50);
5 BEGIN
6 select customer_name
7 into result
8 from customers c
9 where c.customers_id = par_customers_id;
10 return result;
11 END;
12 /
Function created.
测试:
SQL> select customers_id, get_name(customers_id) name
2 from customers;
CUSTOMERS_ID NAME
------------ --------------------
7782 CLARK
7839 KING
7934 MILLER
SQL>
到目前为止一切顺利,不是吗?
如何使用DUAL
表?
SQL> select get_name(7782) from dual;
GET_NAME(7782)
----------------------------------------
CLARK
SQL>