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

Откуда: Урал
Сообщений: 919
Всем привет!
Подскажите, пожалуйста, как исправить процедуру. Дело в том, что у меня имена полей в таблице и передоваемые параметры в процедуре совпадают.
Команда на запись работает.
Команда на изменение не работает.

PROCEDURE ins_users(name_user   IN VARCHAR2,                       
					  email       IN VARCHAR2, 
					  phone       IN VARCHAR2, 					 
					  id_user     IN NUMBER := NULL,  
					  new_id      OUT NUMBER
                     ) 
  AS   	
  BEGIN
			
	IF id_user IS NULL THEN
		INSERT INTO EC2.TUSERS (id, name_user,email, phone) 
		VALUES(seq_users.nextval, name_user, email, phone) RETURNING id INTO new_id;
	ELSE
		UPDATE EC2.TUSERS SET name_user=name_user WHERE id = id_user;		
	END IF;	
	
  END ins_users;
10 сен 12, 15:02    [13140661]     Ответить | Цитировать Сообщить модератору
 Re: Изменение таблицы, через процедуру  [new]
mbsgg
Guest
zvezda_t,

добавь в название параметров "P_"
10 сен 12, 15:05    [13140678]     Ответить | Цитировать Сообщить модератору
 Re: Изменение таблицы, через процедуру  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 51780

zvezda_t
у меня имена полей в таблице и передоваемые параметры в процедуре
совпадают.

Ну так переименуй параметры.

Posted via ActualForum NNTP Server 1.5

10 сен 12, 15:05    [13140680]     Ответить | Цитировать Сообщить модератору
 Re: Изменение таблицы, через процедуру  [new]
zvezda_t
Member

Откуда: Урал
Сообщений: 919
а других вариантов нет?
10 сен 12, 15:08    [13140698]     Ответить | Цитировать Сообщить модератору
 Re: Изменение таблицы, через процедуру  [new]
mbsgg
Guest
zvezda_t
а других вариантов нет?


Есть конечно. Переименуй поля таблицы)))))
10 сен 12, 15:10    [13140705]     Ответить | Цитировать Сообщить модератору
 Re: Изменение таблицы, через процедуру  [new]
zvezda_t
Member

Откуда: Урал
Сообщений: 919
mbsgg, нет)))
Я имела в виду, чтоб оставить названия одинаковыми - никак нельзя?
10 сен 12, 15:11    [13140720]     Ответить | Цитировать Сообщить модератору
 Re: Изменение таблицы, через процедуру  [new]
-2-
Member

Откуда:
Сообщений: 15330
zvezda_t,

скопе.атрибут
10 сен 12, 15:11    [13140721]     Ответить | Цитировать Сообщить модератору
 Re: Изменение таблицы, через процедуру  [new]
mbsgg
Guest
А ваще можешь объявить переменные с отличными от названий полей именами и присвоить им значения из параметров
10 сен 12, 15:12    [13140726]     Ответить | Цитировать Сообщить модератору
 Re: Изменение таблицы, через процедуру  [new]
zvezda_t
Member

Откуда: Урал
Сообщений: 919
простите, что такое скопе?
10 сен 12, 15:13    [13140735]     Ответить | Цитировать Сообщить модератору
 Re: Изменение таблицы, через процедуру  [new]
Vint
Member

Откуда: Москва
Сообщений: 4564
zvezda_t,
пожалейте тех кто будет поддерживать систему. правила наименования для этого и принимаются, избавьте поддержку от говнокода)
10 сен 12, 15:16    [13140749]     Ответить | Цитировать Сообщить модератору
 Re: Изменение таблицы, через процедуру  [new]
suPPLer
Member

Откуда: Харків, Україна
Сообщений: 7794
Блог
zvezda_t
простите, что такое скопе?


Область видимости и контекст применения. В Вашем случае можно указывать имя процедуры и псевдоним/имя таблицы.
		UPDATE EC2.TUSERS SET EC2.TUSERS.name_user=ins_users.name_user WHERE EC2.TUSERS.id = ins_users.id_user;		
10 сен 12, 15:21    [13140780]     Ответить | Цитировать Сообщить модератору
 Re: Изменение таблицы, через процедуру  [new]
zvezda_t
Member

Откуда: Урал
Сообщений: 919
suPPLer, спасибо.
Но это почему то не помогло.
Придется видимо переименовывать переменные...
10 сен 12, 15:44    [13140979]     Ответить | Цитировать Сообщить модератору
 Re: Изменение таблицы, через процедуру  [new]
_Alex_SMIRNOV_
Member

Откуда: Киев
Сообщений: 1519
zvezda_t
suPPLer, спасибо.
Но это почему то не помогло.
Придется видимо переименовывать переменные...


Это не могло не помочь, покажите код!
А вообще послушайте совет и переименуйте параметры, это очень плохой тон программирования называть параметры в процедуре как и поля в таблице.
10 сен 12, 15:50    [13141020]     Ответить | Цитировать Сообщить модератору
 Re: Изменение таблицы, через процедуру  [new]
-2-
Member

Откуда:
Сообщений: 15330
_Alex_SMIRNOV_
это очень плохой тон программирования называть параметры в процедуре как и поля в таблице.
Если это "внешний API", бессмысленные для потребителя API префиксы раздражают.
10 сен 12, 15:53    [13141052]     Ответить | Цитировать Сообщить модератору
 Re: Изменение таблицы, через процедуру  [new]
zvezda_t
Member

Откуда: Урал
Сообщений: 919
_Alex_SMIRNOV_,
собственно код выше:
UPDATE EC2.TUSERS SET EC2.TUSERS.name_user=ins_users.name_user WHERE EC2.TUSERS.id = ins_users.id_user;	


Раз плохой тон - пошла переименовывать)
10 сен 12, 15:54    [13141061]     Ответить | Цитировать Сообщить модератору
 Re: Изменение таблицы, через процедуру  [new]
zvezda_t
Member

Откуда: Урал
Сообщений: 919
_Alex_SMIRNOV_, извините, обманула Вас, это помогло.
вот так не помогло:

UPDATE EC2.TUSERS SET EC2.TUSERS.name_user=name_user WHERE EC2.TUSERS.id = id_user;	
10 сен 12, 16:02    [13141105]     Ответить | Цитировать Сообщить модератору
 Re: Изменение таблицы, через процедуру  [new]
Alexander V. Chubukov
Member

Откуда:
Сообщений: 76
PROCEDURE ins_users(name_user   IN VARCHAR2,                       
					  email       IN VARCHAR2, 
					  phone       IN VARCHAR2, 					 
					  id_user     IN NUMBER := NULL,  
					  new_id      OUT NUMBER
                     ) 
  AS   	
  BEGIN
			
	IF id_user IS NULL THEN
		INSERT INTO EC2.TUSERS (id, name_user,email, phone) 
		VALUES(seq_users.nextval, [b]ins_users.[/b]name_user, [b]ins_users.[/b]email, ins_users.phone) RETURNING id INTO new_id;
	ELSE
		UPDATE EC2.TUSERS SET name_user=[b]ins_users.[/b]name_user WHERE id = [b]ins_users.[/b]id_user;		
	END IF;	
	
  END ins_users;
10 сен 12, 17:08    [13141650]     Ответить | Цитировать Сообщить модератору
 Re: Изменение таблицы, через процедуру  [new]
Alexander V. Chubukov
Member

Откуда:
Сообщений: 76
Alexander V. Chubukov
PROCEDURE ins_users(name_user   IN VARCHAR2,                       
					  email       IN VARCHAR2, 
					  phone       IN VARCHAR2, 					 
					  id_user     IN NUMBER := NULL,  
					  new_id      OUT NUMBER
                     ) 
  AS   	
  BEGIN
			
	IF id_user IS NULL THEN
		INSERT INTO EC2.TUSERS (id, name_user,email, phone) 
		VALUES(seq_users.nextval, ins_users.name_user, ins_users.email, ins_users.phone) RETURNING id INTO new_id;
	ELSE
		UPDATE EC2.TUSERS SET name_user=ins_users.name_user WHERE id = ins_users.id_user;		
	END IF;	
	
  END ins_users;
10 сен 12, 17:09    [13141667]     Ответить | Цитировать Сообщить модератору
 Re: Изменение таблицы, через процедуру  [new]
Ramin Hashimzade
Member

Откуда: Азербайджан, Баку
Сообщений: 9979
Блог
zvezda_t,

ВСЕГДА ГОВОРИЛ, нужно использовать префиксы, оно облегчает жизнь разработчика в минимум 2 раза, например.... все имена таблиц пусть начнется с префиксом проекта, имена полей с префиксом F_, завтра когда бывает нужным писать процедуру или функцию который принимает параметры для полей, достаточно копировать имена полей и изменить F_ например на тот же P_. И код становится читаемым, тот в коде фиг поймещ что есть поле а что параметр.
11 сен 12, 08:06    [13143472]     Ответить | Цитировать Сообщить модератору
 Re: Изменение таблицы, через процедуру  [new]
-2-
Member

Откуда:
Сообщений: 15330
Ramin
и изменить F_ например на тот же P_
a чтобы не перепутать типы с таблицами, процедуры с параметрами и пакетами, функции с полями:
функция в пакете - p_f_
поле таблицы - t_f_
поле вью - v_f_
параметр процедуры в пакете - p_p_p_

и про бд и схему не забываем, так что ко всему этому приписываем bd_sm
11 сен 12, 10:20    [13143965]     Ответить | Цитировать Сообщить модератору
 Re: Изменение таблицы, через процедуру  [new]
Ramin Hashimzade
Member

Откуда: Азербайджан, Баку
Сообщений: 9979
Блог
-2-
Ramin
и изменить F_ например на тот же P_
a чтобы не перепутать типы с таблицами, процедуры с параметрами и пакетами, функции с полями:
функция в пакете - p_f_
поле таблицы - t_f_
поле вью - v_f_
параметр процедуры в пакете - p_p_p_

ну не стоит так извращаться )))
-2-
параметр процедуры в пакете - p_p_p_

хотя это дело вкуса, лично для меня параметр есть параметр не имеет значение оно в функции или в процедуре.
11 сен 12, 10:40    [13144159]     Ответить | Цитировать Сообщить модератору
 Re: Изменение таблицы, через процедуру  [new]
suPPLer
Member

Откуда: Харків, Україна
Сообщений: 7794
Блог
Ramin
все имена таблиц пусть начнется с префиксом проекта

Для этого есть схемы.
Ramin
имена полей с префиксом F_

А это просто перебор.
11 сен 12, 11:01    [13144307]     Ответить | Цитировать Сообщить модератору
 Re: Изменение таблицы, через процедуру  [new]
Ramin Hashimzade
Member

Откуда: Азербайджан, Баку
Сообщений: 9979
Блог
suPPLer
Ramin
все имена таблиц пусть начнется с префиксом проекта

Для этого есть схемы.
Ramin
имена полей с префиксом F_

А это просто перебор.


НИЧЕГО ПЕРЕ БОРНОГО, префиксы избавляет использование зарезервированных слов.
11 сен 12, 11:03    [13144314]     Ответить | Цитировать Сообщить модератору
 Re: Изменение таблицы, через процедуру  [new]
suPPLer
Member

Откуда: Харків, Україна
Сообщений: 7794
Блог
Ramin,

при именовании столбцов я не использую как префиксы, так и ключевые слова, названия встроенных типов и т.д. В случае двусмысленности мне проще добавить к столбцу псевдоним таблицы.
11 сен 12, 11:11    [13144352]     Ответить | Цитировать Сообщить модератору
 Re: Изменение таблицы, через процедуру  [new]
Vint
Member

Откуда: Москва
Сообщений: 4564
Ramin
соглашение о наименовании это хорошо....(неужели я хоть раз с тобой согласен)))))
-2-,suPPLer
хорошо когда есть соглашение о наименовании. тогда не приходится ломать голову какой это обьект. всплывающие подсказки работают быстрее, и вообще:
+ Стандарты наименования и комментариев в SQL и PL\SQL
Стандарты наименования и комментариев в SQL и PL\SQL
1.	Правила наименования
a.	Общие правила наименования
b.	Наименование объектов SQL
c.	Наименование объектов PL_SQL
2.	Правила комментариев
a.	Комментарии SQL
b.	Комментарии PL\SQL
3.	Общие правила написания кода





1.	Правила наименования
a.	Общие правила наименования
<смысловая константа> - сокращение действий выполняемых или включаемых в объект, так же может указывать тип данных.
<группа > - объекты, объединенные по типу. Например, для работы с удаленной базой группа REMOTE(tt_remote_data), желательно не использовать длинные слова, так как групп много не будет.
<наименование > - наименование объекта без префикса.
b.	Наименование объектов SQL
CONTEXT – ctx_<наименование>

CONSTRAINTS – con_<смысловая константа>_<наименование таблицы >_[наименование столбца]
<смысловая константа>: ccheck, p – primary(не должен иметь в конце наименование столбца), f- foreign, u – unique


DATABASE LINK – dl_<наименование базы + схема на которую ссылаемся c префиксами>
Пример: dl_alldb01_sch_gv

DIRECTORY – dir_<наименование >

FUNCTION – f_<смысловая константа>_<наименование >
<смысловая константа>: get – получить информацию, set[_i,_u,_d] – установить несколько значений. Возможны комбинации действий, is – проверка, make – действие
i – вставка записи в таблицу, u – апдейт записи в таблице, d – удаление записи в таблице.
Пример f_get_function  f_set_iu_function
Запрещено создавать процедуры вне пакетов

INDEX – ind_<смысловая константа>_<наименование таблицы>_<перечень столбцов или  сокращенное наименование>
<смысловая константа>: P – индекс по первичному ключу, U – уникальному ключу, F – индекс по столбцу внешнего ключа,M – в индексе используется несколько столбцов, B – бинарный индекс, L- локальный индекс по партицированной таблице, G – глобальный индекс по партицированной таблице
Пример: ind_p_table_name_id  или ind_gu_table_name_date

JAVA CLASS – JC_<наименование >

JAVA RESOURCE – JR_<наименование >

JAVA SOURCE – JS_<наименование >

JOB – job_<наименование >

LIBRARY – lb_<наименование >

MATERIALIZED VIEW – MV_<группа >_<наименование >

PACKAGE – pck_<группа >_<наименование >

PACKAGE BODY –pck_<группа >_<наименование >
Название совпадает с названием пакета
PROCEDURE – p_<смысловая константа>_<наименование >
<смысловая константа>: get – получить информацию по out параметрам, set[_i,_u,_d] – установить несколько значений, возможны комбинации действий, make – действие
i – вставка записи в таблицу, u – апдейт записи в таблице, d – удаление записи в таблице.
Пример p_get_procedure  p_set_iu_procedure
Запрещено создавать процедуры вне пакетов

PUBLIC SYNONYM – sp_<название схемы_название объекта, название DATABASE LINK _ название объекта с префиксами>


QUEUE – q_<наименование >

SCHEMA – sch_<наименование >

SCHEDULE – job_<наименование >

SEQUENCE – sq_<наименование >

SYNONYM – s_<название схемы_название объекта, название DATABASE LINK _ название объекта с префиксами>

TABLE – t_<группа >_<наименование >
В наименованиях таблицы запрещено использовать множественное число (окончание S), дублировать слова и не желательно использовать сокращения. 

TABLESPACE - tbs_<группа >_<наименование >
В наименованиях табличных пространств запрещено использовать множественное число (окончание S), дублировать слова и не желательно использовать сокращения. 


TEMPORARY TABLE – tt_<группа >_<наименование >
В наименованиях таблицы запрещено использовать множественное число (окончание S), дублировать слова и не желательно использовать сокращения. 


TRIGGER – tr_<смысловая константа>_<наименование таблицы>
<смысловая константа>: b – before,a – after,I – insert,u – update, d- delete
Приме: tr_bi_table_name
OBJECT TYPE – ot_<группа >_<наименование >
COLLECTION TYPE – ct_<группа >_<наименование >
VIEW - V_<группа >_<наименование >
В наименованиях таблицы запрещено использовать множественное число(окончание S), дублировать слова и не желательно использовать сокращения 

XML SCHEMA - x_<группа >_<наименование >

Наименование столбцов в таблицах или представлениях:
f<смысловая константа>_<наименование >
<смысловая константа>: в данном контексте типа данных столбца
Char – запрещено к использованию.
Long – запрещено к использованию
Varchar – запрещено к использованию
Varchar2 – v, fv_data
Date – d, fd_date
Number – n, fn_number
CLOB – c, fc_lob
BLOB – b, fb_lob
XMLType – x, fx_schema
TIMESTAMP – t, ft_zona
NUMBER(1) замена Boolean – l, fl_boolean
Пользовательский тип – u, обязан называться fu_<наименование пользовательского типа >
Первичный ключ – k, всегда во всех таблицах называется FK_ID, обязан присутствовать во всех таблицах
Вторичный ключ – k, обязан называться в формате fk_<наименование таблицы> и ссылаться на первичный ключ fk_id, ссылка таблицы на саму себя должна называться fk_parent

c.	Наименование объектов PL_SQL

CURSOR – cr_<>
Наименование переменных в пакетах:
Локальные переменные пакета p<смысловая константа>_<наименование >
Глобальная переменная пакета – g <смысловая константа>_<наименование >
 (gk_id)
In  - i<смысловая константа>_<наименование >, переменная передающаяся в функцию, процедуру (il_flag входящий параметр типа BOOLEAN)
Out –o<смысловая константа>_<наименование >, переменная передающаяся из функции, процедуры
In\out –io<смысловая константа>_<наименование >, переменная передающаяся из\в функцию, процедуру


<смысловая константа>: в данном контексте типа данных столбца
Char – запрещено к использованию.
Long – запрещено к использованию
Varchar – запрещено к использованию
Varchar2 – v, pv_data
Date – d, pd_date
Number – n, pn_number
CLOB – c, gc_lob
BLOB – b, pb_lob
XMLType – x, px_schema
TIMESTAMP – t, gt_zone
BOOLEAN – l, pl_flag
CURSOR – cur, pcur_sql, наименование курсора всегда cur_, а наименование переменной курсора в цикле pcur_
Sys_ref_cursor – ref, pref_sql
%TYPE – t,pt_row
EXCEPTION – ex, pex_exception_name
TYPE tpr_record IS RECORD – для записей, переменная будет pr_record tpr_record;
TYPE tpt_collection IS TABLE – для коллекций pt_collection tpt_collection;
Первичный ключ – k, всегда во всех таблицах называется PK_ID
Вторичный ключ – k, обязан называться в формате pk_<наименование таблицы> Пользовательский тип – u, обязан называться pu_<наименование пользовательского типа с префиксом>

2.Правила комментариев
a.	Комментарии SQL
Комментарии к таблицам или представлению(view) обязаны описывать общий смысл таблицы или представления. Комментарии ко всем объектам обязательны. Для того чтобы избежать использования четырехэтажные названий объектов. Всегда можно посмотреть комментарий.
Формат:
* Описание таблицы
* Описание логики или связанных объектов
* Описание столбцов если необходимо
Комментарии обязаны быть ко всем столбцам. Если описание столбца занимает больше одного предложения, комментарий выносится в комментарий таблицы и в комментарии к столбцу достаточно написать «описан в комментарии к таблице»
b.	Комментарии PL\SQL
Описание пакета в формате
/* Наименование:
 * Краткое описание:
 * Комментарии: 
 * Общее назначение: (Для какой системы написан, основные функции выполняемые пакетом)
 * Редактировал: Дата, Фамилия, кратко что именно отредактировал
 */
Описание функций и процедур в формате:
/* Наименование:
 * Описание:
 * Алгоритм: (основные алгоритмы выполнения функции или процедуры) 
 */
Комментарии для курсоров(явных и неявных) обязательны. Формат любой, главное описать смысл.
Комментарии для сложных блоков обязательны, главное описать общий смысл.
Комментарии глобальных переменных пакета обязательны.
Формат комментариев может быть изменен в зависимости от программного обеспечения, которое будет собирать документацию.

3.Общие правила написания кода
•	Запрещено использовать тип char,varchar,integer,long в определениях типов столбцов таблицы
•	Запрещено использовать типы char,varchar,long в PL/SQL(long разрешено использовать исключительно для интеграции с другими системами)
•	Запрещено использовать ANSI синтаксис в запросах
•	В наименованиях таблицы запрещено использовать множественное число(окончание S), дублировать слова и не желательно использовать сокращения
•	Наименования любых объектов или переменных должно состоять из символов a-z,A-Z,_ любые другие символы запрещены
•	Таблицы в запросах в обязательном порядке должны содержать имя схемы, в которых находятся и альяс для таблицы, то есть раздел from должен выглядеть как:
 from sch_schema.t_table_name al
•	Столбцы в запросе всегда должны содержать альяс таблицы которой они принадлежат. Даже если это запрос к одной таблице
•	Запрещено использовать * в запросах вместо перечня столбцов
•	Запрещено в теле представления использовать другое представление принадлежащее этой же схеме
•	В операции insert всегда! Необходимо описывать список вставляемых столбцов:
Insert into table (id1,id2,id3) ………
•	продолжение

на первый взгляд кажется слишком сложно. но я каждый раз приходя на проект не с самого начала.... жалею что не приняли стандарты и база постепенно превращается в кашу.
11 сен 12, 11:59    [13144830]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Oracle Ответить