Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Перевести в Oracle процедуру / 25 сообщений из 26, страница 1 из 2
15.06.2020, 15:03
    #39969378
Monik1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перевести в Oracle процедуру
помогите, а то с этим синтаксисом 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
15.06.2020, 15:29
    #39969397
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перевести в Oracle процедуру
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
15.06.2020, 15:32
    #39969400
Monik1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перевести в Oracle процедуру
int целое, но этот код же работает в dbeaver, а в oracle там всё number
...
Рейтинг: 0 / 0
15.06.2020, 15:45
    #39969407
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перевести в Oracle процедуру
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
15.06.2020, 15:46
    #39969409
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перевести в Oracle процедуру
Monik1,

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

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

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

Там и без этого баги есть, но ТС их править не просил :)
...
Рейтинг: 0 / 0
15.06.2020, 15:57
    #39969414
Временно забаненный
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перевести в Oracle процедуру
А посмотреть?
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
15.06.2020, 16:02
    #39969416
tru55
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перевести в Oracle процедуру
andrey_anonymous,

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


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


Ты решил освоить PL/SQL в рамках данного топика?
...
Рейтинг: 0 / 0
15.06.2020, 16:20
    #39969436
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перевести в Oracle процедуру
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
15.06.2020, 16:21
    #39969437
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перевести в Oracle процедуру
Временно забаненный


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



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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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


+1 .

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

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

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


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

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


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

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

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

open
fetch
close

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

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

open
fetch
close

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


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

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

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


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