powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Перевести в Oracle процедуру
25 сообщений из 26, страница 1 из 2
Перевести в Oracle процедуру
    #39969378
Monik1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
помогите, а то с этим синтаксисом oracle сложно.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
CREATE PROCEDURE `task_IN`(IN pm INT, OUT updated_count INT)
BEGIN
	DECLARE id, zp, okl, i, new_zp INT;
	DECLARE cur1 CURSOR FOR SELECT ID_CONTR, ZARPLATA, OKLAD FROM contracts;
	DECLARE CONTINUE HANDLER FOR NOT FOUND SET i = 1;
	OPEN cur1;
	SET i = 0;
	SET new_zp = 0;
	SET updated_count = 0;

	WHILE i = 0 DO
		FETCH cur1 INTO id, zp, okl;
		IF pm > okl THEN
			SET new_zp = 1.5*pm;
		ELSEIF okl > 1.5*pm THEN
			SET new_zp = 1.05*zp;
		END IF;
		IF new_zp > 0 THEN
			SET updated_count = updated_count+1;
			UPDATE contracts SET ZARPLATA = new_zp WHERE ID_CONTR = id;
		END IF;
	END WHILE;
	CLOSE cur1;
END
...
Рейтинг: 0 / 0
Перевести в Oracle процедуру
    #39969397
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Monik1,



DECLARE id, zp, okl, i, new_zp INT ;

zp,new_zp int в то же время new_zp = 1.05 *zp

в Вашей системе int целое? как 1.05 *zp приводится в int?

....
stax
...
Рейтинг: 0 / 0
Перевести в Oracle процедуру
    #39969400
Monik1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
int целое, но этот код же работает в dbeaver, а в oracle там всё number
...
Рейтинг: 0 / 0
Перевести в Oracle процедуру
    #39969407
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Monik1
помогите, а то с этим синтаксисом oracle сложно.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
CREATE OR REPLACE PROCEDURE task_IN(pm IN INTeger, updated_count OUT INTeger) as
  new_zp INTeger := 0;
  CURSOR cur1 is SELECT ID_CONTR id, ZARPLATA zp, OKLAD okl FROM contracts for update of ZARPLATA;
BEGIN
  updated_count := 0;
  for i in cur1 loop
    IF pm > i.okl        THEN new_zp := 1.5 * pm;
    ELSIF i.okl > 1.5*pm THEN new_zp := 1.05 * i.zp;
    END IF;
    IF new_zp > 0 THEN
      UPDATE contracts SET ZARPLATA = new_zp WHERE current of cur1;
      updated_count := updated_count+SQL%ROWCOUNT;
    END IF;
  END loop;
END;
/

...
Рейтинг: 0 / 0
Перевести в Oracle процедуру
    #39969409
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Monik1,

скоко в инт будет 1.05*1010=1060.50 (округлит или отбросит)?

в цикле WHILE i = 0 DO new_zp не обнуляется так задумано?

....
stax
...
Рейтинг: 0 / 0
Перевести в Oracle процедуру
    #39969410
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax
в Вашей системе int целое? как 1.05 *zp приводится в int?

Там и без этого баги есть, но ТС их править не просил :)
...
Рейтинг: 0 / 0
Перевести в Oracle процедуру
    #39969414
Временно забаненный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А посмотреть?
Oracle Doc Subprogram Parameters

Тупо проверка компиляции, и лень разбираться что такое CONTINUE HANDLER

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
CREATE  PROCEDURE task_IN (pm IN NUMBER, updated_count OUT NUMBER) 
IS

	id INT;
    zp INT;
    okl INT := 0;
    i INT;
    new_zp INT;
	CURSOR  cur1 IS  SELECT ID_CONTR, ZARPLATA, OKLAD FROM contracts;
--	CONTINUE HANDLER FOR NOT FOUND SET i = 1;
BEGIN
	OPEN cur1;
	i := 0;
	new_zp := 0;
	updated_count := 0;

	WHILE i = 0 
    LOOP
    
		FETCH cur1 INTO id, zp, okl;
		IF pm > okl THEN
			new_zp := 1.5*pm;
		ELSE IF okl > 1.5*pm THEN
			new_zp := 1.05*zp;
		END IF;
        END IF;
		IF new_zp > 0 THEN
			updated_count := updated_count+1;
			UPDATE contracts SET ZARPLATA = new_zp WHERE ID_CONTR = id;
		END IF;
	END LOOP;
	CLOSE cur1;
END;



p.s. Если нет под рукой oracle
проверить можно:
livesql.oracle.com
...
Рейтинг: 0 / 0
Перевести в Oracle процедуру
    #39969416
tru55
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous,

Я бы начинающему не стал излагать про SELECT ... FOR UPDATE и WHERE CURRENT OF. У него и так проблем предостаточно (скорее всего студент) :)
...
Рейтинг: 0 / 0
Перевести в Oracle процедуру
    #39969420
Monik1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Временно забаненный, не подскажите, как вызывать процедуры в oracle?
...
Рейтинг: 0 / 0
Перевести в Oracle процедуру
    #39969428
tru55
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Monik1
не подскажите, как вызывать процедуры в oracle?


BEGIN
proc1(param1, param2, ...);
END;


Ты решил освоить PL/SQL в рамках данного топика?
...
Рейтинг: 0 / 0
Перевести в Oracle процедуру
    #39969436
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Monik1
помогите, а то с этим синтаксисом oracle сложно

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
create or replace procedure task_in(pm integer, updated_count out integer) is
begin
  update contracts set
    zarplata = case 
                 when pm > oklad then 1.5 * pm 
                 when oklad > 1.5 * pm then 1.05 * zarplata
                 else zarplata
               end
  where
    pm > oklad or oklad > 1.5 * pm;
  updated_count := sql%rowcount;
end;
...
Рейтинг: 0 / 0
Перевести в Oracle процедуру
    #39969437
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Временно забаненный


Тупо проверка компиляции, и лень разбираться что такое CONTINUE HANDLER



как из WHILE i = 0 LOOP выходить то собираетесь?

.....
stax
...
Рейтинг: 0 / 0
Перевести в Oracle процедуру
    #39969441
tru55
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax

как из WHILE i = 0 LOOP выходить то собираетесь?
.....
stax

А никто никуда не собирается :) Сейчас модная фишка - находит человек в Инете код на любом SQL (или, условно говоря, PL/SQL) по более менее подходящим словам/заданию и несет сдавать. Когда ему говорят, что это вообще не тот язык, сразу начинаются вопросы о переводе на нужный SQL :))
...
Рейтинг: 0 / 0
Перевести в Oracle процедуру
    #39969447
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer
Код: plsql
1.
procedure task_in(pm integer, updated_count out integer)

Предполагается, что для возврата одного скалярного значения функция не подходит? - Потому что а вдруг ещё что-нибудь захочется вернуть когда-нибудь?
...
Рейтинг: 0 / 0
Перевести в Oracle процедуру
    #39969449
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tru55

А никто никуда не собирается :)


имхо
тогда 22151090 будет долго выполнятся

я сначала решил перевести влоб (open/fetch/close)

засмеют ж, решил одним оператором

смотру не сбрасывается new_zp

а за ето время уж дали ответы

.....
stax
...
Рейтинг: 0 / 0
Перевести в Oracle процедуру
    #39969453
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elic
Предполагается, что для возврата одного скалярного значения функция не подходит?

Вопрос стоит трат времени на его обсуждение?

Elic
Потому что а вдруг ещё что-нибудь захочется вернуть когда-нибудь?

Скорее потому, что и это значение незачем возвращать.
...
Рейтинг: 0 / 0
Перевести в Oracle процедуру
    #39969491
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer

Скорее потому, что и это значение незачем возвращать.


+1 .

Сама процедура не нужна - тут простой UPDATE.

SY.
...
Рейтинг: 0 / 0
Перевести в Oracle процедуру
    #39969513
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SY
процедура не нужна

Вопрос ТС не в процедуре вроде как
Monik1
с ... синтаксисом oracle сложно.
...
Рейтинг: 0 / 0
Перевести в Oracle процедуру
    #39969571
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer
Elic
Предполагается, что для возврата одного скалярного значения функция не подходит?
Вопрос стоит трат времени на его обсуждение?
softwarer
Скорее потому, что и это значение незачем возвращать.
Хороший учитель дал бы сразу не бессмысленный вариант?
А так получается, что ты усугубил неправильный подход, не так ли?
...
Рейтинг: 0 / 0
Перевести в Oracle процедуру
    #39969581
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elic
Предполагается, что для возврата одного скалярного значения функция не подходит?


В T-SQL различие между процедурами и функциями на порядок существеннее нежели в Oracle.
...
Рейтинг: 0 / 0
Перевести в Oracle процедуру
    #39969749
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous
SY
процедура не нужна

Вопрос ТС не в процедуре вроде как
Monik1
с ... синтаксисом oracle сложно.


Перевод с одного языка на другой не делают по-словно. Другие правила построения выражений и другие павила где и когда какие выражения использовать. Так зачем учить по-словному переводу?

SY.
...
Рейтинг: 0 / 0
Перевести в Oracle процедуру
    #39969754
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SY

Так зачем учить по-словному переводу?
SY.

open
fetch
close

тож может пригодится

....
stax
...
Рейтинг: 0 / 0
Перевести в Oracle процедуру
    #39969771
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax

open
fetch
close

тож может пригодится


Может, но неплохо-бы при этом указать что тут так не надо ибо в Oracle row-by-row в 99% случаев (включая данный) есть slow-by-slow.

SY.
...
Рейтинг: 0 / 0
Перевести в Oracle процедуру
    #39969805
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SY
Может, но неплохо-бы при этом указать что тут так не надо ибо в Oracle row-by-row в 99% случаев (включая данный) есть slow-by-slow.

Серебряной пули нет.
Ну и близкий к тексту перевод облегчает понимание/сопровождение "базонезависимой" системы.
...
Рейтинг: 0 / 0
Перевести в Oracle процедуру
    #39969816
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous
"базонезависимой" системы.
Это маркетологическая иллюзия.
...
Рейтинг: 0 / 0
25 сообщений из 26, страница 1 из 2
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Перевести в Oracle процедуру
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]