Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
Топик располагается на нескольких страницах: 1 2      [все]
 Перевести в Oracle процедуру  [new]
Monik1
Member

Откуда:
Сообщений: 3
помогите, а то с этим синтаксисом oracle сложно.

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
15 июн 20, 15:03    [22151047]     Ответить | Цитировать Сообщить модератору
 Re: Перевести в Oracle процедуру  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 2468
Monik1,



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

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

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

....
stax
15 июн 20, 15:29    [22151072]     Ответить | Цитировать Сообщить модератору
 Re: Перевести в Oracle процедуру  [new]
Monik1
Member

Откуда:
Сообщений: 3
int целое, но этот код же работает в dbeaver, а в oracle там всё number
15 июн 20, 15:32    [22151075]     Ответить | Цитировать Сообщить модератору
 Re: Перевести в Oracle процедуру  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18065
Monik1
помогите, а то с этим синтаксисом oracle сложно.

+
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;
/
15 июн 20, 15:45    [22151082]     Ответить | Цитировать Сообщить модератору
 Re: Перевести в Oracle процедуру  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 2468
Monik1,

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

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

....
stax

Сообщение было отредактировано: 15 июн 20, 15:48
15 июн 20, 15:46    [22151084]     Ответить | Цитировать Сообщить модератору
 Re: Перевести в Oracle процедуру  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18065
Stax
в Вашей системе int целое? как 1.05*zp приводится в int?

Там и без этого баги есть, но ТС их править не просил :)
15 июн 20, 15:48    [22151085]     Ответить | Цитировать Сообщить модератору
 Re: Перевести в Oracle процедуру  [new]
Временно забаненный
Member

Откуда:
Сообщений: 47
А посмотреть?
Oracle Doc
Subprogram Parameters


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

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
15 июн 20, 15:57    [22151090]     Ответить | Цитировать Сообщить модератору
 Re: Перевести в Oracle процедуру  [new]
tru55
Member

Откуда: СПб
Сообщений: 19787
andrey_anonymous,

Я бы начинающему не стал излагать про SELECT ... FOR UPDATE и WHERE CURRENT OF. У него и так проблем предостаточно (скорее всего студент) :)
15 июн 20, 16:02    [22151094]     Ответить | Цитировать Сообщить модератору
 Re: Перевести в Oracle процедуру  [new]
Monik1
Member

Откуда:
Сообщений: 3
Временно забаненный, не подскажите, как вызывать процедуры в oracle?
15 июн 20, 16:05    [22151099]     Ответить | Цитировать Сообщить модератору
 Re: Перевести в Oracle процедуру  [new]
tru55
Member

Откуда: СПб
Сообщений: 19787
Monik1
не подскажите, как вызывать процедуры в oracle?


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


Ты решил освоить PL/SQL в рамках данного топика?

Сообщение было отредактировано: 15 июн 20, 16:09
15 июн 20, 16:10    [22151107]     Ответить | Цитировать Сообщить модератору
 Re: Перевести в Oracle процедуру  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 62522
Блог
Monik1
помогите, а то с этим синтаксисом oracle сложно

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;
15 июн 20, 16:20    [22151115]     Ответить | Цитировать Сообщить модератору
 Re: Перевести в Oracle процедуру  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 2468
Временно забаненный


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



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

.....
stax
15 июн 20, 16:21    [22151116]     Ответить | Цитировать Сообщить модератору
 Re: Перевести в Oracle процедуру  [new]
tru55
Member

Откуда: СПб
Сообщений: 19787
Stax

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

А никто никуда не собирается :) Сейчас модная фишка - находит человек в Инете код на любом SQL (или, условно говоря, PL/SQL) по более менее подходящим словам/заданию и несет сдавать. Когда ему говорят, что это вообще не тот язык, сразу начинаются вопросы о переводе на нужный SQL :))
15 июн 20, 16:29    [22151120]     Ответить | Цитировать Сообщить модератору
 Re: Перевести в Oracle процедуру  [new]
Elic
Member [заблокирован]

Откуда: 1984. Выбраковка финно-угром продолжается. КЯЗ
Сообщений: 29861
softwarer
procedure task_in(pm integer, updated_count out integer)
Предполагается, что для возврата одного скалярного значения функция не подходит? - Потому что а вдруг ещё что-нибудь захочется вернуть когда-нибудь?

Сообщение было отредактировано: 15 июн 20, 16:34
15 июн 20, 16:36    [22151126]     Ответить | Цитировать Сообщить модератору
 Re: Перевести в Oracle процедуру  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 2468
tru55

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


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

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

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

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

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

.....
stax
15 июн 20, 16:41    [22151130]     Ответить | Цитировать Сообщить модератору
 Re: Перевести в Oracle процедуру  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 62522
Блог
Elic
Предполагается, что для возврата одного скалярного значения функция не подходит?

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

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

Скорее потому, что и это значение незачем возвращать.
15 июн 20, 16:48    [22151138]     Ответить | Цитировать Сообщить модератору
 Re: Перевести в Oracle процедуру  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 9899
softwarer

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


+1 .

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

SY.
15 июн 20, 18:31    [22151205]     Ответить | Цитировать Сообщить модератору
 Re: Перевести в Oracle процедуру  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18065
SY
процедура не нужна

Вопрос ТС не в процедуре вроде как
Monik1
с ... синтаксисом oracle сложно.
15 июн 20, 20:25    [22151237]     Ответить | Цитировать Сообщить модератору
 Re: Перевести в Oracle процедуру  [new]
Elic
Member [заблокирован]

Откуда: 1984. Выбраковка финно-угром продолжается. КЯЗ
Сообщений: 29861
softwarer
Elic
Предполагается, что для возврата одного скалярного значения функция не подходит?
Вопрос стоит трат времени на его обсуждение?
softwarer
Скорее потому, что и это значение незачем возвращать.
Хороший учитель дал бы сразу не бессмысленный вариант?
А так получается, что ты усугубил неправильный подход, не так ли?
16 июн 20, 07:56    [22151339]     Ответить | Цитировать Сообщить модератору
 Re: Перевести в Oracle процедуру  [new]
env
Member

Откуда: Россия, Москва
Сообщений: 5982
Elic
Предполагается, что для возврата одного скалярного значения функция не подходит?


В T-SQL различие между процедурами и функциями на порядок существеннее нежели в Oracle.
16 июн 20, 09:07    [22151352]     Ответить | Цитировать Сообщить модератору
 Re: Перевести в Oracle процедуру  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 9899
andrey_anonymous
SY
процедура не нужна

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


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

SY.
16 июн 20, 13:45    [22151592]     Ответить | Цитировать Сообщить модератору
 Re: Перевести в Oracle процедуру  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 2468
SY

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

open
fetch
close

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

....
stax
16 июн 20, 13:57    [22151608]     Ответить | Цитировать Сообщить модератору
 Re: Перевести в Oracle процедуру  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 9899
Stax

open
fetch
close

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


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

SY.
16 июн 20, 14:29    [22151653]     Ответить | Цитировать Сообщить модератору
 Re: Перевести в Oracle процедуру  [new]
andrey_anonymous
Member

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

Серебряной пули нет.
Ну и близкий к тексту перевод облегчает понимание/сопровождение "базонезависимой" системы.
16 июн 20, 15:37    [22151731]     Ответить | Цитировать Сообщить модератору
 Re: Перевести в Oracle процедуру  [new]
Elic
Member [заблокирован]

Откуда: 1984. Выбраковка финно-угром продолжается. КЯЗ
Сообщений: 29861
andrey_anonymous
"базонезависимой" системы.
Это маркетологическая иллюзия.
16 июн 20, 16:00    [22151750]     Ответить | Цитировать Сообщить модератору
 Re: Перевести в Oracle процедуру  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18065
Elic
andrey_anonymous
"базонезависимой" системы.
Это маркетологическая иллюзия.

В значительной мере, но не полная.
16 июн 20, 16:06    [22151754]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2      [все]
Все форумы / Oracle Ответить