2012-03-02 2 views
-1

varchar, nvarchar2 또는 varchar2를 Oracle 데이터베이스에 전달하는 QString 변수와 비교하는 동안 문제가 있습니다.QString과 (varchar, nvarchar2, varchar2) 비교

CREATE TABLE Korisnici 
     (
      id_korisnika varchar(200) PRIMARY KEY, 
      ime_korisnika varchar2(200), 
      prezime_korisnika varchar2(200), 
      broj_telefona varchar2(30), 
      adresa_korisnika varchar2(400) 
     ) 
     /

여기 내 절차 : 디버깅 할 때 내가 문자를 보낼 수있는

//procedure for updating user 
    CREATE OR REPLACE PROCEDURE Update_korisnika(
     stari_id IN varchar, 
     novo_ime_korisnika IN varchar2, 
     novo_prezime_korisnika IN varchar2, 
     novi_broj_telefona_korisnika IN varchar2, 
     nova_adresa_korisnika IN varchar2) 

    IS 
    BEGIN 
     UPDATE Korisnici 
     SET Korisnici.ime_korisnika=novo_ime_korisnika 
      , Korisnici.prezime_korisnika=novo_prezime_korisnika 
      , Korisnici.broj_telefona=novi_broj_telefona_korisnika 
      , Korisnici.adresa_korisnika=nova_adresa_korisnika 
     WHERE Korisnici.id_korisnika=stari_id; 
     COMMIT; 
    END; 
/

그리고 QT 코드 :

//this is for updateing user 
    void MainWindow::promjeni_korisnika(const QString& id, const QString& ime, const QString& prezime, const QString& broj, const QString& adresa) 
    { 
     //parametri 
     init(); 
     QUrl params; 
      params.addQueryItem("action","Update_korisnika"); 
      params.addQueryItem("id",id); 
      params.addQueryItem("ime",ime); 
      params.addQueryItem("prezime",prezime); 
      params.addQueryItem("broj",broj); 
      params.addQueryItem("adresa",adresa); 

      QByteArray data; 
      data.append(params.toString()); 
      data.remove(0,1); 

      QNetworkRequest request; 
      request.setUrl(url); 
      request.setHeader(QNetworkRequest::ContentTypeHeader, 
      QVariant("application/x-www-form-urlencoded")); 

      manager->post(request, data); 

      MainWindow::dataList.clear(); 
      Citanje_korisnika(); 
    } 

그래서 난 단지 ID를 사용하는 절차에 문제가 어떻게 이 모든 일을하기 위해서. 이 ID를 비교할 수있는 데이터의 유형은 무엇이든지 사용할 수 있습니다.

EDIT : 이 상기 QT 함수로 데이터를 전송 QML 함수이다

funkcije.promjeni_korisnika(text_input5.text,text_input1.text,text_input2.text,text_input3.text,text_input4.text); 

다음 스크립트의 일부분이 허용 데이터 :

Update_korisnika($poslani_ar,$id=$_POST['id_korisnika'],$ime=$_POST['ime'],$prezime=$_POST['prezime'],$broj=$_POST['broj'],$adresa=$_POST['adresa']); 

하고이 부분이 코드가 호출

function Update_korisnika($poslani_ar,$id,$ime,$prezime,$broj,$adresa) 
{ 
    $imenik = new Imenik($poslani_ar,$id,$ime,$prezime,$broj,$adresa); 
    $imenik->Update_korisnika(); 
} 

다음 :

function Update_korisnika(){ 
     $query='BEGIN Update_korisnika(:id_korisnika,:ime_korisnika,:prezime_korisnika,:broj_telefona,:adresa);END;'; 
     $result=$this->connector->Exec($this->poslani_argument,$query,$this->id_korisnika,$this->ime_korisnika,$this->prezime_korisnika,$this->broj_telefona,$this->adresa); 
     //echo $ArrayToXml->toXml($result); 
    } 

마지막에는 모든 것을 실행하는 스크립트 만 있습니다. 나는 생성자와 불필요한 것을 넣지 않았다. 이것은 예를 들어 함께 작동하는 코드의 일부입니다.

PHP가 실행되면 어떻게 추적 할 수 있습니까?

+0

정확히 무엇이 문제입니까? 저장 프로 시저가 데이터를 업데이트하지 않는 것이 문제라면, 전달되는 'stari_id'를 기록 할 수 있습니까? 전달되는 'stari_id'는 무엇이고 업데이트 될 행의'id_korisnika'는 무엇입니까? 다른 쪽이 아닌 하나의 끝에 공백이 있거나 케이싱에 차이가 있습니까? –

+0

문제는 내가 정상적으로 만들 수있는 항목을 추가하려고 할 때입니다. 그러나 예를 들어 변경 데이터를 업데이트하려고 할 때. old_id (stari_id)를 사용하여 Qstring에서 Qstring ID로 보내야합니다. 아무 일도 일어나지 않습니다. QT와 오라클 간에는 데이터를 처리하지만 스크립트는 정상적으로 작동하는 PHP 스크립트가 있습니다. 오라클과 QT는 캐스팅에 약간의 문제가 있습니다.내가 오라클에 데이터를 게시 할 때 디버깅하고 예를 들어 id_user (id_korisnika)를 '3'으로 보냈습니다. 하지만 아무 것도 업데이트하지 않고 있습니다. –

+0

1)'id_korisnika'가 숫자 인 경우에는 문자열이 아닌 데이터베이스에서'NUMBER'로 정의해야합니다. 2) 전달되는 'STARI_ID'가 전달되는 스토어드 프로 시저에 로깅하고 있음을 나타내시겠습니까? '3'은 선행 또는 후행 공백이 없으며'Korisnici' 테이블을 쿼리하고 'id_korisnika'가 '3'이고'UPDATE' 문이 행을 업데이트하지 않는다고? –

답변

1

저장 프로 시저로 보내지는 것을 로깅하여 시작하겠습니다. 전달 된 데이터와 업데이트 된 행 수를 기록하도록 저장 프로 시저를 수정하면 무엇이 표시됩니까?

CREATE TABLE update_proc_log (
    id_korisnika varchar2(200), 
    ime_korisnika varchar2(200), 
    prezime_korisnika varchar2(200), 
    broj_telefona varchar2(30), 
    adresa_korisnika varchar2(400), 
    rows_updated  number, 
    call_timestamp timestamp 
); 



CREATE OR REPLACE PROCEDURE Update_korisnika(
    stari_id IN varchar, 
    novo_ime_korisnika IN varchar2, 
    novo_prezime_korisnika IN varchar2, 
    novi_broj_telefona_korisnika IN varchar2, 
    nova_adresa_korisnika IN varchar2) 

IS 
    l_rows_updated integer; 
BEGIN 
    UPDATE Korisnici 
    SET Korisnici.ime_korisnika=novo_ime_korisnika 
     , Korisnici.prezime_korisnika=novo_prezime_korisnika 
     , Korisnici.broj_telefona=novi_broj_telefona_korisnika 
     , Korisnici.adresa_korisnika=nova_adresa_korisnika 
    WHERE Korisnici.id_korisnika=stari_id; 
    l_rows_updated := sql%rowcount; 

    INSERT INTO update_proc_log(id_korisnika , 
           ime_korisnika , 
           prezime_korisnika , 
           broj_telefona , 
           adresa_korisnika , 
           rows_updated , 
           call_timestamp) 
     VALUES(stari_id, 
       novo_ime_korisnika, 
       novo_prezime_korisnika, 
       novi_broj_telefona_korisnika, 
       nova_adresa_korisnika , 
       l_rows_updated, 
       systimestamp); 
    COMMIT; 
END; 
/
+0

ID가 표시되지 않습니다. 하지만 예를 들어 이름이 바뀌 었음을 알 수 있습니다. 그러나 id는 빈 공간입니다. –

+0

@denonth - ID가 표시되지 않습니다. 로그 테이블에? 로그 테이블에 행이 있습니까? 'ROWS_UPDATED'가 로그 테이블에 설정되어있는 것은 무엇입니까? –

+0

나는 이것을한다. select * from update_proc_log' –

2

는 "id_korisnika이 숫자로했다 시작 부분에서, 나는이 VARCHAR, NVARCHAR2, VARCHAR2로에게 을 변경했습니다. 그러나 문제의 어떤 종류가있다. 나는 그것을 추적하는 방법을 모른다 스토어드 프로 시저에서 SQL * Plus에서 Korisnici의 select * 을 호출하면 숫자 3을 볼 수 있습니다. "

그래, 실제 문제는 문자열 데이터 형식에 숫자를 저장한다는 것입니다. 쿼리에서는 3처럼 보일 수 있지만 ' 3', '3 ', ' 3 ', '3' 또는 3과 공백의 다른 순열이 될 수 있습니다.

데이터 모델을 정리하면됩니다.