首页 > 解决方案 > 为什么我尝试获取名称时功能不起作用?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;

对不起,我的英语不好。

标签: sqloraclefunctionplsql

解决方案


您编写的代码几乎可以。你犯了两个错误:

  • 如果列名是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>

推荐阅读