Hallo Freunde der Nacht,
ich habe gerade das Problem, dass ich in einem Modul eine Stored Procedure einrichten muss. Das funktioniert auch wunderbar, wenn ich das in der SQL DB direkt mache. Packe ich das ganze aber in ein execute der oxlegacydb, dann meckert er immer. Scheinbar hat er mit DELIMITER ein Problem. Selbst wenn ich das alleine ausführe kommt die Fehlermeldung. “Check your syntax…”
Hatte schonmal jemand das Problem? Oder hat jemand noch eine andere Idee (Parameterübergabe oder ähnliches…). Hier noch der SQL Code, den ich ausführen möchte:
DELIMITER $$
create procedure YSAddColumnUnlessExists(
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
)
THEN
set @ddl=CONCAT('ALTER TABLE ',tableName,' ADD COLUMN ',fieldName,' ',fieldDef);
prepare stmt from @ddl;
execute stmt;
END IF;
end$$
DELIMITER;
Beste Grüße,
Thorsten
Hatte das Problem auch aber leider keine Lösung gefunden (liegt an ADOdb).
Hi leofonic,
ich habe eben nochmal geprüft und erstaunlich finde ich, dass das bei anderen Installationen läuft. Ich mach hier in den nächsten Tagen mal noch ein paar Tests. Vor allem würde mich da jetzt natürlich mal brennend interessieren, ob das nur bei bestimmten Kombinationen auftritt, oder vielleicht sogar an der MySQL Konfiguration liegt.
Aber an dieser Stelle eine damit verbundene Frage. Ich benutze die Stored Procedure um bei einer Modulinstallation Felder in Tabellen anzulegen, die es noch nicht gibt. Möglicherweise wolltest Du es für den selben Zweck verwenden? Wenn ja, hast Du eine (effiziente und fehlertolerante) Alternative gefunden?
Grüße,
Thorsten
Vielleicht nutzen die ja mysqli?
Alternativen fallen mir ein: Logik in PHP statt in stored procedures. Oder den Anwender die Query manuell ausführen lassen. Oder selbst eine DB-Connection herstellen und den Query direkt ohne ADODB ausführen.
[QUOTE=thorsten.schneider;157382]
ich habe eben nochmal geprüft und erstaunlich finde ich, dass das bei anderen Installationen läuft. Ich mach hier in den nächsten Tagen mal noch ein paar Tests. Vor allem würde mich da jetzt natürlich mal brennend interessieren, ob das nur bei bestimmten Kombinationen auftritt, oder vielleicht sogar an der MySQL Konfiguration liegt.
[/QUOTE]
Kann es an der MySQL-Version liegen?
[QUOTE=thorsten.schneider;157382]
Aber an dieser Stelle eine damit verbundene Frage. Ich benutze die Stored Procedure um bei einer Modulinstallation Felder in Tabellen anzulegen, die es noch nicht gibt. Möglicherweise wolltest Du es für den selben Zweck verwenden? Wenn ja, hast Du eine (effiziente und fehlertolerante) Alternative gefunden?
[/QUOTE]
Ich habe da mal eine Methode in der updateApp zu gesehen. Schau mal in eine der Dateien in updateApp/updates/php/. Da müsste es so etwas geben:
class update_5_1_6 extends updateBase
{
/**
* default action, used in start update
*
* @var string
*/
protected $_sDefaultAction = 'updateSqlFromPHP';
/**
* Continue update with sql script
*
* @return string
*/
public function updateSqlFromPHP()
{
$dbManager = new oxDbMetaDataHandler();
if( !$dbManager->fieldExists('OXSHOWCUSTOMAGREEMENT','oxarticles') ) {
oxDb::getDb()->execute("ALTER TABLE `oxarticles` ADD OXSHOWCUSTOMAGREEMENT` TINYINT( 1 ) UNSIGNED NOT NULL DEFAULT '1' COMMENT 'Show custom agreement check in checkout';");