Невозможно выполнить процесс в oracle 10 g

Я пытаюсь выполнить простую процедуру Как это сделано в oracle 10g, но не могу получить ошибку PLS-00905: объект dbnew.sp_TDCCountry недействителен, любая идея будет оценена Таблица

CREATE TABLE TDCCountry
( CountryID number(10) NOT NULL,
  CountryName varchar2(50) NOT NULL  
);

Процедура

CREATE OR REPLACE PROCEDURE SP_TDCCountry 
IS
BEGIN  
select * from tdcCountry;
COMMIT;
 END SP_TDCCountry;

Исполнение 1.

begin
   SP_TDCCountry;
  end;

2.exec SP_TDCCountry;

Пожалуйста, задайте редактировать свой вопрос и добавьте полученное сообщение об ошибке. Но: нельзя что-то выбрать, не сохранив где-нибудь. Что вы пытаетесь сделать с этой процедурой? Он выбирает все из таблицы, но ничего с этим не делает. Вы упростили код до такой степени, что процедура практически бесполезна.

a_horse_with_no_name 11.04.2018 12:21

Я отредактировал вопрос. Я буду использовать значение, полученное через proc.

Mohan 11.04.2018 12:28
0
2
39
1

Ответы 1

Потому что у вас нет предложения into, с помощью которого вы возвращаете значения некоторым переменным. Возможно, будет правильным вернуть вашу переменную как rowtype [Кстати, для оператора non-DDL (в данном случае это SELECT) фиксация не требуется].

Итак, вы можете использовать следующим образом:

SQL> set serveroutput on;
SQL> CREATE OR REPLACE PROCEDURE SP_TDCCountry IS
      v_row tdcCountry%rowtype;
BEGIN
      select * into v_row from tdcCountry;
      dbms_output.put(v_row.countryid||' - ');
      dbms_output.put_line(v_row.countryname);
END;
/
SQL> exec SP_TDCCountry;

Если ваш оператор SELECT содержит более одной строки, то данные можно вернуть с помощью cursor:

SQL> CREATE OR REPLACE PROCEDURE SP_TDCCountry IS
      v_row tdcCountry%rowtype;
BEGIN
      for c in ( select * from tdcCountry )
      loop
       dbms_output.put(c.countryid||' - ');
       dbms_output.put_line(c.countryname);
      end loop; 
END;
/
SQL> exec SP_TDCCountry;

У меня уже есть данные в tdcCountry, и я хочу получить их, вызвав процесс в программе, но через вышеупомянутый процесс, о котором вы снова упоминаете, после выполнения появляется ошибка, что «точная выборка возвращает больше, чем запрошенное количество строк».

Mohan 11.04.2018 14:15

@Mohan, хорошо, в этом случае (с too_many_rows) вместо into правильнее переносить данные курсором (я только что редактировал).

Barbaros Özhan 11.04.2018 15:14

Другие вопросы по теме