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

为什么在尝试获取名称时功能不起作用? PL / 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>
,

您的函数没有异常处理,并且您确定select仅返回单个值。

因为如果没有,那么函数将引发错误,因此该函数将无法正常执行,因为没有异常处理。

在sql developer中执行以下查询,以识别表中有多个记录的客户ID。

select customers_id,count(1)
    from customers c
group by customers_id;

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