Oracle 当我选择

Oracle 当我选择,oracle,plsql,plsqldeveloper,plsql-package,Oracle,Plsql,Plsqldeveloper,Plsql Package,我目前有一个程序存储在一个包中。我想从客户机表中获取所有数据,但我有一个错误。问题出在p_listar_客户端存储的过程中 代码是: 创建表并插入 create table cliente (id NUMBER, name VARCHAR(50), address VARCHAR(50), salary NUMBER); INSERT INTO cliente VALUES (1, 'camilo chaparro', 'popayan', 563321); INSERT INTO clien

我目前有一个程序存储在一个包中。我想从客户机表中获取所有数据,但我有一个错误。问题出在p_listar_客户端存储的过程中

代码是:

创建表并插入

create table cliente (id NUMBER, name VARCHAR(50), address VARCHAR(50), salary NUMBER);

INSERT INTO cliente VALUES (1, 'camilo chaparro', 'popayan', 563321);
INSERT INTO cliente VALUES (2, 'ernesto lopez', 'ibague', 768954);
INSERT INTO cliente VALUES (3, 'camila españa', 'medellin', 113456);
INSERT INTO cliente VALUES (4, 'john jimenez', 'pasta', 789456);
INSERT INTO cliente VALUES (5, 'silvio jimenez', 'cali', 456123);
创建包:

CREATE OR REPLACE PACKAGE paquete_cliente_listar IS
--add clientes
  PROCEDURE p_agregar_clientes (
                                    c_id IN cliente.id%TYPE,
                                    c_name IN cliente.name%TYPE,
                                    c_address IN cliente.address%TYPE,
                                    c_salary IN cliente.salary%TYPE
                                    );

--delete clientes
  PROCEDURE p_quitar_clientes (c_id IN cliente.id%TYPE);

--Lists all customers 
   PROCEDURE p_listar_cliente;

--listar todos los clientes
END paquete_cliente_listar;

车身组件:

CREATE OR REPLACE PACKAGE BODY paquete_cliente_listar AS 
--agregar clientes
  PROCEDURE p_agregar_clientes (
                                    c_id  cliente.id%TYPE,
                                    c_name  cliente.name%TYPE,
                                    c_address  cliente.address%TYPE,
                                    c_salary cliente.salary%TYPE
                                    ) IS
    BEGIN 

        INSERT INTO cliente (id, name, address, salary) VALUES (c_id, c_name, c_address, c_salary);

    END p_agregar_clientes;

--quitar clientes
  PROCEDURE p_quitar_clientes (c_id IN cliente.id%TYPE) IS

  BEGIN 

    DELETE FROM cliente WHERE id = c_id;


  END p_quitar_clientes;

--listar todos los clientes

 PROCEDURE p_listar_cliente AS
    BEGIN

    clientes_cursor cliente%rowtype;

     CURSOR clientes_cursor IS 
        SELECT id, name, address, salary FROM cliente;




    OPEN clientes_cursor;
    LOOP
      FETCH clientes_cursor INTO clientes_cursor;
      EXIT WHEN clientes_cursor%notfound;
      DBMS_OUTPUT.put_line(clientes_cursor.id || ' ' || clientes.name);
     END LOOP;

 END p_listar_cliente;


END paquete_cliente_listar;
我有一个问题:

错误:包体PAQUETE\u CLIENTE\u LISTAR 行/列:30/21 PLS-00103:在预期以下情况时遇到符号“客户”:

:=。( @ % ; 符号“:”已替换为“客户”以继续

行/列:32/13 PLS-00103:在预期以下情况之一时遇到符号“客户光标”:


:=.(@%;

第一个问题是必须在
开始之前声明变量。但是,如果使用游标进行循环,您的代码将更简单、更快,而不是试图弄清楚变量是如何工作的,如下所示:

...
 PROCEDURE p_listar_cliente AS

 BEGIN

    FOR clientes IN
    (
      SELECT id, name, address, salary FROM cliente
    ) LOOP
      DBMS_OUTPUT.put_line(clientes.id || ' ' || clientes.name);
    END LOOP;

 END p_listar_cliente;
...

第一个问题是在
开始之前必须声明变量。但是,如果使用游标进行循环,则代码将更简单、更快,而不是试图弄清楚变量是如何工作的,如下所示:

...
 PROCEDURE p_listar_cliente AS

 BEGIN

    FOR clientes IN
    (
      SELECT id, name, address, salary FROM cliente
    ) LOOP
      DBMS_OUTPUT.put_line(clientes.id || ' ' || clientes.name);
    END LOOP;

 END p_listar_cliente;
...

变量的声明有问题。必须在开始之前声明

PROCEDURE p_listar_cliente AS
clientes_cursor cliente%rowtype; -- moved it before BEGIN
 CURSOR clientes_cursor IS 
    SELECT id, name, address, salary FROM cliente;   -- moved it before BEGIN 

BEGIN
OPEN clientes_cursor;
LOOP
  FETCH clientes_cursor INTO clientes_cursor;
  EXIT WHEN clientes_cursor%notfound;
  DBMS_OUTPUT.put_line(clientes_cursor.id || ' ' || clientes.name);
 END LOOP;

 END p_listar_cliente;
使用光标后关闭光标也是一种良好的做法


干杯!!

变量声明有问题。必须在开始之前

PROCEDURE p_listar_cliente AS
clientes_cursor cliente%rowtype; -- moved it before BEGIN
 CURSOR clientes_cursor IS 
    SELECT id, name, address, salary FROM cliente;   -- moved it before BEGIN 

BEGIN
OPEN clientes_cursor;
LOOP
  FETCH clientes_cursor INTO clientes_cursor;
  EXIT WHEN clientes_cursor%notfound;
  DBMS_OUTPUT.put_line(clientes_cursor.id || ' ' || clientes.name);
 END LOOP;

 END p_listar_cliente;
使用光标后关闭光标也是一种良好的做法


干杯!!

PLS-00103是一个语法错误。语法错误通常很容易通过比较我们的代码来解决。PLS-00103是一个语法错误。语法错误通常很容易通过比较我们的代码来解决。