Я совершенно новичок в SQL и пытаюсь выполнить хранимую процедуру, которую даже не уверен, что написал правильно. Предполагается, что он выдает общее количество пациентов для данного доктора, и это хранимая процедура, которую мне удалось скомпилировать в Oracle SQL Developer:
CREATE PROCEDURE Totalptcount
(drid IN INTEGER,
totalpts OUT INTEGER)
IS
BEGIN
SELECT COUNT(pts) AS totalpts
INTO totalpts
FROM ptlist
WHERE drid = '1';
END Totalptcount;
Я пытаюсь ввести значение «1» и получить общее количество точек (количество строк) для доктора с идентификатором «1».
Как мне это выполнить? Большое спасибо заранее
Попробовал несколько ответов, которые я нашел здесь, на подобные вопросы, но ни один из них не помог. Я также не знаю, как использовать курсоры или объявлять их, но не думаю, что они понадобятся для моей хранимой процедуры (я думаю). Я пробовал:
var totalpts NUMBER
EXEC totalptcount (:totalpts);
SELECT totalpts;
- This gave the INTO clause requirement error
BEGIN
Exec totalptcount
END;
- I don't really know what I'm doing and just tried this
BEGIN
Exec totalptcount('1')
END;
- Trying to input value '1' to get out the count
- Unknown command error
Заранее спасибо!


After your compile it, go into the connections window.
Open the schema.
One of the folders there should be for procedures.
Find your procedure and open it..
You should see a tool which is a green triangle.
Click that and it will open a dialog that can be used to run your procedure.
Вы можете найти кое-что для чтения на https://www.thatjeffsmith.com/ это может помочь сократить время вашего обучения.
Я предлагаю вам переименовать параметр drid в input_drid и использовать его для замены жестко запрограммированной цифры «1» в вашем запросе. Таким образом, вы можете выбрать любой идентификатор доктора, какой захотите.
Спасибо!! Я проверю этот сайт и спасибо за совет о его переименовании и указания о том, как найти это диалоговое окно. Я видел несколько скриншотов с ним, но понятия не имел, как туда добраться. Я также не знал, как заставить его работать с любым идентификатором Dr, так что большое спасибо!
Вызов хранимой процедуры (называемой модулем PL/SQL) выполняется внутри другого блока PL/SQL. Однако у SQL*Plus есть ярлык, EXEC который просто оборачивает команду в оболочку PL/SQL BEGIN .... END;. Вы можете получить значение в переменную связывания или локальную переменную PL/SQL и вывести его на дисплей различными способами:
В SQL*Plus:
var totalpts NUMBER
EXEC Totalptcount(1,:totalpts);
print totalpts
Или
var totalpts NUMBER
BEGIN
Totalptcount(1,:totalpts);
END;
print totalpts
Или:
set serveroutput on;
DECLARE
totalpts number;
BEGIN
Totalptcount(1,totalpts);
dbms_output.put_line(totalpts);
END;
Или даже:
var totalpts NUMBER
DECLARE
totalpts number;
BEGIN
Totalptcount(1,var_totalpts);
:totalpts := var_totalpts;
END;
print totalpts
Множество опций, и это только для клиента SQLPlus. То, как вы вызываете процедуру и получаете результат, зависит от используемого стека клиентских технологий (в данном случае SQLPlus, но это может быть много чего).
Однако имейте в виду, что для большинства основных потребностей SQL вам вообще не нужны процедуры. Просто напишите SQL, который получит нужный вам результат, и выполните его напрямую. Мы используем PL/SQL, когда у нас есть более сложные потребности, требующие полного программного управления потоком данных, которое SQL сам по себе не обеспечивает.
Спасибо!! Как за предложения, так и за другую информацию. Мне определенно нужно больше читать. Я сделал это, чтобы просто узнать о процедурах в целом, но вполне логично, что его не будут использовать для таких простых задач. Я действительно ценю твою помощь!
Exec— это команда SQL*\Plus, которую нельзя использовать в блоке PL/SQL. Процедуру Totalptcount необходимо вызывать с обоими аргументами, один из которых должен быть переменной. Любой отдельный оператор внутри блока PL/SQL должен заканчиваться точкой с запятой. До версии 23 оператор SELECT должен иметь предложение FROM, напримерSELECT * FROM DUAL;. Возможно, вам захочется просмотреть руководство, чтобы получить дополнительную помощь по началу работы. Stack Overflow, скорее всего, не то место, которое поможет вам начать работу над этим проектом.