Ma ktoś pomysł jak to wcisnąć w SQL_ThreadQuery() ?
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.
|
Napisano 30.06.2019 15:53
Ma ktoś pomysł jak to wcisnąć w SQL_ThreadQuery() ?
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);
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
Napisano 01.07.2019 13:08
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
Napisano 01.07.2019 17:46
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:
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
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
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
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żytkowników, 1 gości, 0 anonimowych