2016-04-28 6 views
1

ist hier eine einfache MySQL-SchemaWarum führt diese gespeicherte Prozedur zu einem anderen Ergebnis als die manuelle Ausführung des Inhalts?

CREATE TABLE Currency 
(
    id   SMALLINT NOT NULL AUTO_INCREMENT PRIMARY KEY 
    ,code  CHAR(3) NOT NULL UNIQUE 
    ,exponent TINYINT NOT NULL 
    ,sign  VARCHAR (5) NOT NULL DEFAULT '¤' 
    ,ccx_enabled BOOLEAN NOT NULL DEFAULT FALSE 
    ,is_fiat  BOOLEAN NOT NULL 
); 

CREATE TABLE `SiteAccount` 
(
    id   INT NOT NULL AUTO_INCREMENT PRIMARY KEY 
    ,currency SMALLINT NOT NULL 
    ,iban  VARCHAR (34) NULL DEFAULT NULL 
    ,ethereum CHAR (40) NULL DEFAULT NULL 
    ,crypto_user INT NULL DEFAULT NULL 
    ,FOREIGN KEY (currency) REFERENCES Currency (id) 
); 

CREATE PROCEDURE SetUpUserEthereumAddress (id INT, addr TEXT) 
INSERT INTO SiteAccount (currency, ethereum, crypto_user) 
VALUES 
(
    (SELECT id FROM Currency WHERE code='ETH'), 
    addr, 
    id 
); 

Wenn ich die gespeicherte Prozedur aufrufen, eine Zeile mit der falschen Währung erstellt.

INSERT INTO Currency (code, exponent, sign, is_fiat, ccx_enabled) VALUES 
    ('GBP', 2, '£', 1, 1) 
    ,('USD', 2, '$', 1, 1) 
    ,('EUR', 2, '€', 1, 1) 
    ,('ETH', 6, 'Ξ', 0, 1) 
; 

CALL SetUpUserEthereumAddress (1, '5bb0aa60d694714db16cbd3e3574c59d5ee4a95b'); 

select * from SiteAccount JOIN Currency on SiteAccount.currency=Currency.id; 

Diese creates a row mit der Währung statt ETH GBP. Aber wenn ich den Körper der gespeicherten Prozedur herauskopiere und die Argumente manuell ersetze, bekomme ich das korrekte Ergebnis.

INSERT INTO SiteAccount (currency, ethereum, crypto_user) 
VALUES 
(
    (SELECT id FROM Currency WHERE code='ETH'), 
    '----aa60d694714db16cbd3e3574c59d5ee4a95b', 
    2 
); 

select * from SiteAccount JOIN Currency on SiteAccount.currency=Currency.id; 

Dies erstellt einen Datensatz für Währung ETH wie erwartet.

Warum wählt/speichert die gespeicherte Prozedur die falsche Währungs-ID?

+0

'SELECT ID FROM Währung ->' SELECT Currency.ID FROM Währung' – PetSerAl

+0

Danke, können Sie das eine tatsächliche Antwort machen, damit ich es akzeptieren kann? – spraff

+0

@ Jordan ... warum? – spraff

Antwort

2

Wenn Sie in Prozedur gespeichert, unqualifizierte id in SELECT id FROM Currency WHERE code='ETH' beziehen sich auf gespeicherte Prozedur id Parameter, aber nicht id Spalte in Currency Tabelle. Um auf die Tabellenspalte zu verweisen, müssen Sie id mit Tabellenname qualifizieren: SELECT Currency.id FROM Currency WHERE code='ETH'.

+0

Alternativ könnte auch der Name des Prozedurparameters in etwas anderes als _id_ geändert werden bekomme auch das richtige Ergebnis. – PaulF

Verwandte Themen