Простой Oracle pl/sql ?

User avatar
oleg lebedev
Уже с Приветом
Posts: 1872
Joined: 03 Dec 2003 23:13
Location: Одесса - Новая Англия

Re: Простой Oracle pl/sql ?

Post by oleg lebedev »

metaller wrote:
Leberecht wrote:заявляя, что подобная затея на PL/SQL не реализуема? :wink:
Да при чём тут pl/sql ? Это процедурный язык и речь не о нём. Ждем решения поставленной задачи для Oracle от великого гуру Leberecht.
Вы меня опередили. Я только собирался объяснить товарищу, что Oracle SQL и PL/SQL совершенно разные вещи, а это уже стало неактуально в связи с вашим объяснением..
Для того чтобы съэкономить ему мнения от шатаний по форумам для новичков в Оракле, я хотел бы его проинформировать, что есть Оракл БД, а есть PL/SQL engine, который предназначен для Oracle DB access. Эти вещи настолько разные и независимые, что скажем varchar2 в базе имеет limit в 4К, в то время как в PL/SQL это 32К. PL/SQL engine вполне можно перекомпелировать на работающей базе и при этом база данных об этом может и не подозревать. Вместо PL/SQL можно писать proсedures на Java и ничего в принципе не изменится с точки зрения написания queries. Синтакс будет другой, а смысл тот же самый.

Code: Select all

Надеюсь, Вы там не "вляпались по-второй", заявляя, что подобная затея на PL/SQL не реализуема? 
Чтобы вляпаться по второй, нужно вляпаться по первой. Я пока этого не заметил. Я не путаю плоды вашей больной фантазии с реальностью.
Я нигде не писал, что ваша идея нереализуема. Её можно реализовать на Оракле несколькими способами. Я против идеи не имею ничего против. Я просто думаю, что это не лучшее решение в данном случае.
Перестали бы вы, Leberecht выпендриваться. Ваш уровень понятен. Повинитесь, вас простят и поймут. В конце концев мы тоже люди и сострадание нам не чуждо. К тому же вы тут приобрели новые знания в области Оракла и это тоже пойдёт к вам на пользу.
User avatar
oleg lebedev
Уже с Приветом
Posts: 1872
Joined: 03 Dec 2003 23:13
Location: Одесса - Новая Англия

Re: Простой Oracle pl/sql ?

Post by oleg lebedev »

Leberecht wrote:Народ, да вы попросту поиздеваться, поприкалываться в воскресение вечером порешили что-ли? :pain1:

Ну ладно, получайте вашу ораклёвую версию

Ент понятно для создания и заполнения якобы большой таблички с кучей записей, которую надо "развернуть"

Code: Select all

create table BigWithManyColumns(AAA int, i1 int, i2 int, i3 int);
insert into BigWithManyColumns values(100,10,20,30);
insert into BigWithManyColumns values(200,10,20,30);
commit;
А вот собственно и "разворот"

Code: Select all

select a.aaa,  
    case b.key when 1 then I1 when 2 then I2 when 3 then I3 end   as I
from BigWithManyColumns a
    cross join
        (select 1 as key from dual
        union
        select 2 from dual
        union
        select 3 from dual) b
 order by a.aaa;
Пследний "order by a.aaa" само собой чисто для наглядности.

Ровно так, как я в самом первом своём ответе здесь и написал
" создаёте временную табличку (ну или попросту саб-квери из 5 или скольки там рекордов) и с ней джойните большую."

Спокойной ночи всем! :wink:
Это какой-то бред. Почему это должно работать быстро? Я не уверен, что это работает правильно.
Leberecht
Уже с Приветом
Posts: 6888
Joined: 06 Jan 2010 07:13
Location: Miami Beach, FL

Re: Простой Oracle pl/sql ?

Post by Leberecht »

Ды ладно, Олеж, вляпались по-полной, хватит уж дурачком-то прикидываться.
Вот-же Вам эта элементарщина на самом разобычном ораклёвом SQLе (не PL/SQL)
Ент понятно для создания и заполнения якобы большой таблички с кучей записей, которую надо "развернуть"

Code: Select all

create table BigWithManyColumns(AAA int, i1 int, i2 int, i3 int);
insert into BigWithManyColumns values(100,10,20,30);
insert into BigWithManyColumns values(200,10,20,30);
commit;
А вот собственно и "разворот"

Code: Select all

select a.aaa,  
    case b.key when 1 then I1 when 2 then I2 when 3 then I3 end   as I
from BigWithManyColumns a
    cross join
        (select 1 as key from dual
        union
        select 2 from dual
        union
        select 3 from dual) b
 order by a.aaa;
Вы тут явно решили пофлидить кучей параграфов, дабы скрыть (завуалировать) Ваше полнейшее незнание такой элементарщины, как подзапросы? :wink:

Боже праведный, а народ ещё чёй-т жалуется на индусов и их код :ROFL:
Ordnung muss sein!
Leberecht
Уже с Приветом
Posts: 6888
Joined: 06 Jan 2010 07:13
Location: Miami Beach, FL

Re: Простой Oracle pl/sql ?

Post by Leberecht »

oleg lebedev wrote:Это какой-то бред. Почему это должно работать быстро? Я не уверен, что это работает правильно.
Дык а я, уже начитамши про Ваши познания в базах данных, абсолютно уверен в том, что Вы даже опрочесть ентот распростецкий запросец окажитесь не в состоянии и само собой усомнитесь в том, что он работает правильно :D
Last edited by Leberecht on 18 Feb 2013 15:49, edited 1 time in total.
Ordnung muss sein!
User avatar
oleg lebedev
Уже с Приветом
Posts: 1872
Joined: 03 Dec 2003 23:13
Location: Одесса - Новая Англия

Re: Простой Oracle pl/sql ?

Post by oleg lebedev »

Ды ладно, Олеж, вляпались по-полной, хватит уж дурачком-то прикидываться.
Вот-же Вам эта элементарщина на самом разобычном ораклёвом SQLе (не PL/SQL)
Про PL/SQL вы сами упомянули и очень не к месту. Я вам объяснил разницу между SQL и PL/SQL и сейчас вы уже пытаетесь набрасываться со смесью ваших фантазий и новыми знаниями, которые вы тут подчерпнули здесь несколько минут назад. Я вижу, что урок вы усвомли хорошо и, надеюсь, что уже не будете путать SQL и PL/SQL впредь.
Однако ваше невежество лезет из всех щелей и каждой фразы, которые вы выжимаете из себя. Например, вы тут разорялись, что я не понимаю что такое subquery. Там где вы написали свой код, укажите, пожалуйста, то что вы называете subquery. Мне это поможет немного понять ваш словесный поток, наполненый терминологией, упомянутой не к месту.
User avatar
APLY
Уже с Приветом
Posts: 291
Joined: 08 Jun 2007 03:38
Location: BOSTON

Re: Простой Oracle pl/sql ?

Post by APLY »

Ой что творится, не ссорьтесь товарисчи специалисты пожалста!

Для товариша Leberecht, идея понятна но как реализовать не совсем ясно.
Пожласта посмотрите не начальные условия, отличаестя от вашего примера:

columns like this:
acct1, acct1_property1, acct1_property2,acct1_property3, acct1_property4, acct1_property5,acct2, acct2_property1, acct2_property2,acct2_property3, acct2_property4, acct2_property5,acct1, acct3_property1, acct3_property2,acct3_property3, acct3_property4, acct3_property5, и т.д.
Всe в одной row.
Всeго 5 accounts i 5 properties for each account.
Обратите внимание all properties named differently. Как тут CASE организовать?

Leberecht,
Если можно , напишите код с испольванием етих конкретно данных.
Спасибо за идею все равно!
Last edited by APLY on 18 Feb 2013 16:21, edited 2 times in total.
В мире столько всего загадочного и непонятного!
и чем больше я занимаюсь боксом тем больше для меня загадочного и непонятного!
Leberecht
Уже с Приветом
Posts: 6888
Joined: 06 Jan 2010 07:13
Location: Miami Beach, FL

Re: Простой Oracle pl/sql ?

Post by Leberecht »

APLY, Вам надо результат в каком виде получить?

Типа такого:
Account, Property
Accnt1, Acc1_Prop1
Accnt1, Acc1_Prop2
Accnt1, Acc1_Prop3
Accnt2, Acc1_Prop1
Accnt2, Acc1_Prop2
Accnt2, Acc1_Prop3
и т.д. ?

Пардон, Вы-ж в самом начале написали
acct1, acct1_property1, acct1_property2,acct1_property3, acct1_property4, acct1_property5
acct2, acct1_property1, acct2_property2,acct2_property3, acct2_property4, acct2_property5
acct3, acct3_property1, acct3_property2,acct3_property3, acct3_property4, acct3_property5
acct4, acct4_property1, acct4_property2,acct4_property3, acct4_property4, acct4_property5
acct5, acct5_property1, acct5_property2,acct5_property3, acct5_property4, acct5_property5
Ordnung muss sein!
User avatar
APLY
Уже с Приветом
Posts: 291
Joined: 08 Jun 2007 03:38
Location: BOSTON

Re: Простой Oracle pl/sql ?

Post by APLY »

Надо сделать 5 rows :
acct1, acct1_property1, acct1_property2,acct1_property3, acct1_property4, acct1_property5
acct2, acct1_property1, acct2_property2,acct2_property3, acct2_property4, acct2_property5
acct3, acct3_property1, acct3_property2,acct3_property3, acct3_property4, acct3_property5
acct4, acct4_property1, acct4_property2,acct4_property3, acct4_property4, acct4_property5
acct5, acct5_property1, acct5_property2,acct5_property3, acct5_property4, acct5_property5
В мире столько всего загадочного и непонятного!
и чем больше я занимаюсь боксом тем больше для меня загадочного и непонятного!
User avatar
APLY
Уже с Приветом
Posts: 291
Joined: 08 Jun 2007 03:38
Location: BOSTON

Re: Простой Oracle pl/sql ?

Post by APLY »

Ну да,

Спасибо !
В мире столько всего загадочного и непонятного!
и чем больше я занимаюсь боксом тем больше для меня загадочного и непонятного!
Leberecht
Уже с Приветом
Posts: 6888
Joined: 06 Jan 2010 07:13
Location: Miami Beach, FL

Re: Простой Oracle pl/sql ?

Post by Leberecht »

voilà svp

Code: Select all

select case b.key when 1 then a.acct1 when 2 then a.acct2 when 3 then a.acct3 when 4 then a.acct4 when 5 then a.acct5 end as Account
	,case b.key when 1 then a.acct1_property1 when 2 then a.acct2_property1 when 3 then a.acct3_property1 when 4 then a.acct4_property1 when 5 then a.acct5_property1 end as Property1
	,case b.key when 1 then a.acct1_property2 when 2 then a.acct2_property2 when 3 then a.acct3_property2 when 4 then a.acct4_property2 when 5 then a.acct5_property2 end as Property2
	,case b.key when 1 then a.acct1_property3 when 2 then a.acct2_property3 when 3 then a.acct3_property3 when 4 then a.acct4_property3 when 5 then a.acct5_property3 end as Property3
	,case b.key when 1 then a.acct1_property4 when 2 then a.acct2_property4 when 3 then a.acct3_property4 when 4 then a.acct4_property4 when 5 then a.acct5_property4 end as Property4
	,case b.key when 1 then a.acct1_property5 when 2 then a.acct2_property5 when 3 then a.acct3_property5 when 4 then a.acct4_property5 when 5 then a.acct5_property5 end as Property5
from YourVeryHugeTable a
    cross join
        (select 1 as key from dual
        union
        select 2 from dual
        union
        select 3 from dual
		union
        select 4 from dual
		union
        select 5 from dual) b
Ordnung muss sein!
User avatar
APLY
Уже с Приветом
Posts: 291
Joined: 08 Jun 2007 03:38
Location: BOSTON

Re: Простой Oracle pl/sql ?

Post by APLY »

Да спасибо должно работать!
Надо проверить что быстрее.
В мире столько всего загадочного и непонятного!
и чем больше я занимаюсь боксом тем больше для меня загадочного и непонятного!
User avatar
APLY
Уже с Приветом
Posts: 291
Joined: 08 Jun 2007 03:38
Location: BOSTON

Re: Простой Oracle pl/sql ?

Post by APLY »

А может кто знает, how to run Oracle stored proc (job) from the command line?
I need it to schedule and monitor with Autosys job.
I assume sqlplus is needed.
В мире столько всего загадочного и непонятного!
и чем больше я занимаюсь боксом тем больше для меня загадочного и непонятного!
ПростоНик
Уже с Приветом
Posts: 1486
Joined: 28 Aug 2008 17:34
Location: UT

Re: Простой Oracle pl/sql ?

Post by ПростоНик »

Напишите Korn Shell script ( ну не обязательно Korn) , где с помощью sqlplus запускаете Oracle stored proc.
User avatar
APLY
Уже с Приветом
Posts: 291
Joined: 08 Jun 2007 03:38
Location: BOSTON

Re: Простой Oracle pl/sql ?

Post by APLY »

А примерчик можно? и , если можно, с return parameter.

0 - success или 1- failure
чтобы етот код вoзврашал

Спасибо!
В мире столько всего загадочного и непонятного!
и чем больше я занимаюсь боксом тем больше для меня загадочного и непонятного!
Leberecht
Уже с Приветом
Posts: 6888
Joined: 06 Jan 2010 07:13
Location: Miami Beach, FL

Re: Простой Oracle pl/sql ?

Post by Leberecht »

Помимо того, что в личке чирканул, вот ещё примерчик

Например, надо что-т там в базе данных поделать и в зависимости от исхода сообщить об успехе или провале.

Создаём SQL файлик, где ровно все свои запросики или вызовы хранимых процедур и записываем.

В том месте, когда скрипт "выаснил", что всё радужно и пора завершаться, пишем для SQLPLUSа команду QUIT SUCCESS или EXIT SUCCESS.
Ежли пора завершаться с позорным провалом - QUIT FAILURE. Можно даже с упреждением завершиться, типа EXIT WARNING.

ОК, файл (let's call it YourFile.sql) создан, теперь его исполняем вот так
sqlplus user/password@hostname:port/SID @YourFile.sql (Само собой, вместо hostname:port/SID можно попросту TNSNAME врисовать)

Конечно-же можно адресовать аутпут в какой-нить другой тн ЛОГ файлик с помощью >SomeLogFile.txt

Kомандочку енту и загоням в AUTOSYS JIL файл.
Он будет выглядеть примерно так:

insert_job: YOUR_JOB_NAME
job_type: c

command: sqlplus user/password@hostname:port/SID @/folder/YourFile.sql

machine: YOUR_SERVER_NAME

owner: user@domain

permission: gx,wx,mx,me

days_of_week: all

start_times: "15:00, 14:00"

description: "Whatever you decide to write about it"

alarm_if_fail: 1

max_exit_success: 1

Вот и всё :gen1:
Ordnung muss sein!
User avatar
metaller
Уже с Приветом
Posts: 4514
Joined: 06 Jul 2011 12:22
Location: Oak Harbor, WA

Re: Простой Oracle pl/sql ?

Post by metaller »

APLY wrote:А может кто знает, how to run Oracle stored proc (job) from the command line?
I need it to schedule and monitor with Autosys job.
I assume sqlplus is needed.
Вы на знаниях форумчан деньги делаете ? ;)
Я не хочу оплачивать ничьи аборты, велферы или детсады. Каждый должен сам принимать решения и нести за них ответственность.
User avatar
Интеррапт
Уже с Приветом
Posts: 17281
Joined: 07 Sep 2011 10:05
Location: Seattle, WA

Re: Простой Oracle pl/sql ?

Post by Интеррапт »

metaller wrote:
APLY wrote:А может кто знает, how to run Oracle stored proc (job) from the command line?
I need it to schedule and monitor with Autosys job.
I assume sqlplus is needed.
Вы на знаниях форумчан деньги делаете ? ;)
Ну в этом разделе многие задают вопросы, которые им нужны по работе, так что многие "на знаниях форумчан деньги делают". Вполне нормальная ситуация. Сегодня ты кому-то подскажешь, завтра тебе подскажут.
Leberecht
Уже с Приветом
Posts: 6888
Joined: 06 Jan 2010 07:13
Location: Miami Beach, FL

Re: Простой Oracle pl/sql ?

Post by Leberecht »

Ды мне чё, не жалко, сильно много времени не отняло.
Ordnung muss sein!
User avatar
APLY
Уже с Приветом
Posts: 291
Joined: 08 Jun 2007 03:38
Location: BOSTON

Re: Простой Oracle pl/sql ?

Post by APLY »

Leberecht
Спасибо большое, как раз то что надо!
На работе горю :)
В мире столько всего загадочного и непонятного!
и чем больше я занимаюсь боксом тем больше для меня загадочного и непонятного!
User avatar
Albert_al
Уже с Приветом
Posts: 2305
Joined: 14 Apr 1999 09:01
Location: Ural->CA

Re: Простой Oracle pl/sql ?

Post by Albert_al »

oleg lebedev wrote:Помните, что если select затрагивает, как минимум 40% всех строчек из таблицы, то full scan может дать лучший результат
:nono#: :nono#: 10-15%
Alcohol, Tobacco, Firearms, and Explosives. The makings of a great weekend in West Virginia!
User avatar
valchkou
Уже с Приветом
Posts: 4185
Joined: 27 Apr 2011 03:43
Location: Сергели ->Chicago

Re: Простой Oracle pl/sql ?

Post by valchkou »

Albert_al wrote:
oleg lebedev wrote:Помните, что если select затрагивает, как минимум 40% всех строчек из таблицы, то full scan может дать лучший результат
:nono#: :nono#: 10-15%
как вычисляется такой % ?
наш оптимизатор, который оптимизировал базу МТС упоминал цифру в >1%.
Т.е все что более можно фул скан.
Если скажем в таблице 1млн записей, а нужно достать всего 10 000,
то большая вероятность, что эти 10к будут разбросаны по бОльшей часть блоков.
User avatar
Albert_al
Уже с Приветом
Posts: 2305
Joined: 14 Apr 1999 09:01
Location: Ural->CA

Re: Простой Oracle pl/sql ?

Post by Albert_al »

valchkou wrote:как вычисляется такой % ?
наш оптимизатор, который оптимизировал базу МТС упоминал цифру в >1%.
Лучше даже менее 10, just try
Alcohol, Tobacco, Firearms, and Explosives. The makings of a great weekend in West Virginia!
Sergey___K
Уже с Приветом
Posts: 13014
Joined: 10 Jul 2001 09:01
Location: VA

Re: Простой Oracle pl/sql ?

Post by Sergey___K »

(наивно) а из pipelined можно по пять раз pipe row ?
User avatar
valchkou
Уже с Приветом
Posts: 4185
Joined: 27 Apr 2011 03:43
Location: Сергели ->Chicago

Re: Простой Oracle pl/sql ?

Post by valchkou »

Albert_al wrote:
valchkou wrote:как вычисляется такой % ?
наш оптимизатор, который оптимизировал базу МТС упоминал цифру в >1%.
Лучше даже менее 10, just try
так а я что написал 1% и есть меньше 10.
Я полагаю вычисляется исходя из размера+параметров блока и размера записи.
Т.е сначала надо выяснить сколько строк может быть в блоке.
Тогда можно предположить, что если в блоке 1000 записей, но 1млн строк = 1 000 блоков.
значит при доставании 10 000 записей есть хорошая вероятность считать все 1000 блоков.
вобщем из наблюдений на той базе был сделан вывод, что если более 1% то делаем full scan.

just try - не всегда работает, особенно если девелопер а не админ, а на продакшн не везде впускают,
особенно если делать продукт, а не домашние поделки.
User avatar
Uzito
Уже с Приветом
Posts: 8230
Joined: 06 Feb 2002 10:01
Location: NJ, USA

Re: Простой Oracle pl/sql ?

Post by Uzito »

Leberecht wrote:voilà svp
Так, к сведению...

Code: Select all

case b.key when 1 then ... when 2 then ... when 3 then ...
использовать не имеет никакого смысла. Лучше уж DECODE(b1.key,1, .., 2, .., 3, ..) - проще и нагляднее.

и вместо

Code: Select all

select 1 from dual union select 2 from dual union select 3 from dual union
пользуйтест генераторами типа

Code: Select all

SELECT ROWNUM rn FROM DUAL CONNECT BY LEVEL < 4
Проверил ваш метод на работе, благо большая таблица имеется. UNION ALL работает чуть быстрее (2.76s) vs 2.83s, оракловый оптимизатор при union all не лажается с вычислением cardinality и execution cost 202 vs 354.

Return to “Вопросы и новости IT”