Skocz do zawartości

Witamy w Nieoficjalnym polskim support'cie AMX Mod X

Witamy w Nieoficjalnym polskim support'cie AMX Mod X, jak w większości społeczności internetowych musisz się zarejestrować aby móc odpowiadać lub zakładać nowe tematy, ale nie bój się to jest prosty proces w którym wymagamy minimalnych informacji.
  • Rozpoczynaj nowe tematy i odpowiedaj na inne
  • Zapisz się do tematów i for, aby otrzymywać automatyczne uaktualnienia
  • Dodawaj wydarzenia do kalendarza społecznościowego
  • Stwórz swój własny profil i zdobywaj nowych znajomych
  • Zdobywaj nowe doświadczenia

Dołączona grafika Dołączona grafika

Guest Message by DevFuse
 

Zdjęcie

Procedury sql


  • Nie możesz napisać tematu
  • Zaloguj się, aby dodać odpowiedź
10 odpowiedzi w tym temacie

#1 csMaster

    Wszechwiedzący

  • Power User

Reputacja: 14
Początkujący

  • Postów:542
  • Lokalizacja:localhost
Offline

Napisano 30.06.2019 15:53

Spoiler

 

Ma ktoś pomysł jak to wcisnąć w SQL_ThreadQuery() ?


  • +
  • -
  • 0

#2 Rivit

    Godlike

  • Support Team

Reputacja: 1 319
Godlike

  • Postów:4 380
Offline

Napisano 30.06.2019 19:00

new query2[512];
formatex(query2, 511, "USE `table`;\
DROP procedure IF EXISTS `AddColumnUnlessExists`;\
\
DELIMITER $$\
USE `table`$$\
create procedure AddColumnUnlessExists(\
	IN dbName tinytext,\
	IN tableName tinytext,\
	IN fieldName tinytext,\
	IN fieldDef text)\
begin\
	IF NOT EXISTS (\
		SELECT * FROM information_schema.COLUMNS\
		WHERE column_name=fieldName\
		and table_name=tableName\
		and table_schema=dbName\
		)");

format(query2, 511, "%s\
	THEN\
		set @ddl=CONCAT('ALTER TABLE ',dbName,'.',tableName,\
			' ADD COLUMN ',fieldName,' ',fieldDef);\
		prepare stmt from @ddl;\
		execute stmt;\
	END IF;\
end$$\
\
DELIMITER ;", query);

Rivit (30.06.2019 19:00):
Coś takiego, mogłem się gdzieś pomylić, ale na ogół tak to się robi

  • +
  • -
  • 0

#3 csMaster

    Wszechwiedzący

  • Autor tematu
  • Power User

Reputacja: 14
Początkujący

  • Postów:542
  • Lokalizacja:localhost
Offline

Napisano 01.07.2019 12:59

Błędów w wysyłaniu powyższego zapytania nie ma, ale procedura dalej się nie utworzyła (tak, wysłałem zapytania pod ten sam schemat sql)

SQL_ThreadQuery(hTuple, "sql_handle", "call AddColumnUnlessExists('sch', 't', 'column', 'boolean default 0')");

 

Blad w zapytaniu: PROCEDURE sch.AddColumnUnlessExists does not exist

 


  • +
  • -
  • 0

#4 DarkGL

    Nie oddam ciasteczka !

  • Administrator

Reputacja: 6 555
Godlike

  • Postów:11 983
  • GG:
  • Steam:steam
  • Imię:Rafał
  • Lokalizacja:Warszawa
Offline

Napisano 01.07.2019 13:08

ustawiles odpowiednia nazwe bazy podczas tworzenia procedury ? jak sprawdzasz bledy podczas tworzenia procedury ?
  • +
  • -
  • 0

#5 csMaster

    Wszechwiedzący

  • Autor tematu
  • Power User

Reputacja: 14
Początkujący

  • Postów:542
  • Lokalizacja:localhost
Offline

Napisano 01.07.2019 16:33

Tak, ustawiłem odpowiednią. Zapytanie tworzące tabele działa poprawnie. Błędy sprawdzam wykonując log_amx() w handlerze zapytania sql_handle(). Jedyny błąd jaki w ten sposób wychwytuje plugin to próba użycia nieistniejącej procedury. Zapytanie z procedurą nie wysyła żadnych błedów do handlera sql_handle(), ale procedury w bazie danych dalej nie ma.


Użytkownik csMaster edytował ten post 01.07.2019 16:35

  • +
  • -
  • 0

#6 DarkGL

    Nie oddam ciasteczka !

  • Administrator

Reputacja: 6 555
Godlike

  • Postów:11 983
  • GG:
  • Steam:steam
  • Imię:Rafał
  • Lokalizacja:Warszawa
Offline

Napisano 01.07.2019 17:46

Pokaż pełen kod pluginu
  • +
  • -
  • 0

#7 csMaster

    Wszechwiedzący

  • Autor tematu
  • Power User

Reputacja: 14
Początkujący

  • Postów:542
  • Lokalizacja:localhost
Offline

Napisano 01.07.2019 18:54

Kodu jeszcze nawet w połowie nie skończyłem, a test zapytań robiłem na oddzielnym pluginie aby nie musieć później go poprawiać i gubić się w kilku tysiącach linijek kodu.

Kod na którym testowałem zapytania wygląda tak:

 

Spoiler

  • +
  • -
  • 0

#8 Rivit

    Godlike

  • Support Team

Reputacja: 1 319
Godlike

  • Postów:4 380
Offline

Napisano 03.07.2019 17:40

USE `sch`;\
	DROP procedure IF EXISTS `AddColumnUnlessExists`;\
	DELIMITER $$\
	USE `sch`$$\
	create procedure AddColumnUnlessExists(\
	IN dbName tinytext,\
	IN tableName tinytext,\
	IN fieldName tinytext,\
	IN fieldDef text)\
	begin\
	IF NOT EXISTS (\
	SELECT * FROM information_schema.COLUMNS\
	WHERE column_name=fieldName\
	and table_name=tableName\
	and table_schema=dbName\)

Ostatnia linia, ten ukośnik tam ma być na pewno w tym miejscu? Może to to?

 

 

 

 

Jak sprawdzasz czy masz procedury w bazie? 

SHOW PROCEDURE STATUS;

tym?

 

 

Czy może być tak, że moduł od sqla nie supportuje zmiany delimitera? 

 


Użytkownik TibacK edytował ten post 03.07.2019 18:17

  • +
  • -
  • 0

#9 csMaster

    Wszechwiedzący

  • Autor tematu
  • Power User

Reputacja: 14
Początkujący

  • Postów:542
  • Lokalizacja:localhost
Offline

Napisano 06.07.2019 15:04

Cały 'create procedute AddColumnUnlessExists()' można zapisać w jednej linii, ale ten ukośnik chyba nie robi różnicy skoro w terminalu zapytanie z tym nawiasem w nowej linii normalnie się wykonuje.

Nie sprawdzam czy procedura istnieje żadnym zapytaniem, tylko odświeżam listę procedur po czym normalnie powinna tam być.

Zapytanie działa  i z tym delimiter'em. Jeśli wykonuje je ręcznie, procedura się tworzy, a jeśli utworze procedurę kreatorem dostępnym w sql, sam dodaje ten delimiter do polecenia.

 

Ale chwila... Czy ten ukośnik / przechodzi do nowej linii czy po prostu to taki znak żeby formatex() poprawnie działało ?

Zostawiłem tam ten ukośnik bo myślałem, że w ten sposób przejdę do nowej linii, normalnie nie powinno go tam być.

Ale ogólnie to w tym zapytaniu są 3 zapytania (2 'use') więc te ukośniki nic nie zmienią. I bez tego jednego ukośnika, i bez wszystkich ukośników rezultat jest taki sam.


Użytkownik csMaster edytował ten post 06.07.2019 15:14

  • +
  • -
  • 0

#10 Rivit

    Godlike

  • Support Team

Reputacja: 1 319
Godlike

  • Postów:4 380
Offline

Napisano 06.07.2019 15:47

Ten ukośnik jak jest na końcu linii to chyba jest pomijany :v nie wiem dokładnie.

A jak wypiszesz sobie zapytanie to on jest tam czy nie?

 

może jakieś uprawnienia na tworzenie tych procedur? skonczyly mi sie pomysly


  • +
  • -
  • 0

#11 csMaster

    Wszechwiedzący

  • Autor tematu
  • Power User

Reputacja: 14
Początkujący

  • Postów:542
  • Lokalizacja:localhost
Offline

Napisano 06.07.2019 17:51

DELIMITER //
CREATE PROCEDURE AddColumnUnlessExists(IN dbName tinytext, IN tableName tinytext, IN fieldName tinytext, IN fieldDef text)
BEGIN
IF NOT EXISTS(SELECT * FROM information_schema.COLUMNS WHERE column_name = fieldName and table_name = tableName and schema_name = dbName)
THEN
SET @ddl = CONCAT('ALTER TABLE ', dbName, '.', tableName, ' ADD COLUMN ', fieldName, ' ', fieldDef);
PREPARE stmt from @ddl;
EXECUTE stmt;
END IF;
END//
DELIMITER ;

Po wykonaniu takiego polecenia w bazie danych, procedura się utworzyła.

Jedyny problem jest z tym delimiter'em. Nie wiem w jaki sposób dodać go do SQL_ThreadQuery().

Nie mogę tego dodać do oddzielnego polecenia sql bo delimiter nie jest poleceniem, ale nie mogę też dodać go do pojedynczego polecenia bo funkcja SQL_ThreadQuery() w ten sposób całość zapisze w jednej linii co również jest błędem bo delimiter musi być w osobnej linijce. Te ukośniki tylko umożliwiają pisanie dalszej części tekstu w formatex() ale nie przechodzą do nowej linii w sql.


Użytkownik csMaster edytował ten post 06.07.2019 18:13

  • +
  • -
  • 0




Użytkownicy przeglądający ten temat: 0

0 użytkowników, 0 gości, 0 anonimowych