oracle ORA-06576:不是Qt c++中有效函数或过程名

chhqkbe1  于 2022-11-28  发布在  Oracle
关注(0)|答案(1)|浏览(254)

用C++在Qt中进行即时通讯开发
我已将ORACLE连接到Qt Creator。
但是当我在Qt中调用PROCEDURE时,我收到了以下错误“ORA-06576:不是有效的函数或过程名“
我写了如下代码


CREATE OR REPLACE PROCEDURE INPUT_CUSTOMER 
(
    ck IN NUMBER ,
    clinic IN varchar2,
    dentist IN varchar2,
    license IN varchar2,
    number_c IN varchar2,
    amount IN NUMBER 
)
IS
BEGIN
    INSERT INTO CUSTOMER c(c.CUSTOMER_KEY, c.CLINIC_NAME, c.LICENSE_NUMBER, c.DENTIST_NAME, c.PHONE_NUMBER, c.ORDER_AMOUNT)
    VALUES  (ck, clinic, license, dentist, number_c, amount);
    COMMIT;
END INPUT_CUSTOMER ;

数量中的代码**

QSqlQueryModel *inputQuery = new QSqlQueryModel;
    inputQuery->setQuery
            (QString("CALL INPUT_CUSTOMER (%1, %2, %3, %4, %5, %6)")
             .arg(ck).arg(clinic).arg(license).arg(dentist).arg(number).arg(0));
    if (inputQuery->lastError().isValid())
        qDebug() << inputQuery->lastError();

请检查我的代码
标准秒

gr8qqesn

gr8qqesn1#

你的手术没问题。
您的QT代码使用模板字符串和字符串串联构建查询,这就是错误的原因(这是一种不好的做法,因为它会导致SQL注入漏洞)。
相反,您应该使用绑定变量构建查询:

QSqlQuery query(db);
query.prepare("CALL INPUT_CUSTOMER (:ck, :clinic, :license, :dentist, :number, :amount)");
query.setForwardOnly(true);
query.bindValue(":ck", ck);
query.bindValue(":clinic", clinic);
query.bindValue(":license", license);
query.bindValue(":dentist", dentist);
query.bindValue(":number", number);
query.bindValue(":amount", 0);
bool query_executed_ok = query.exec();
  • (我不是QT开发人员,这是从文档和其他类似问题的答案中摘录的,因此可能存在语法错误,但它旨在为您提供正确过程的指南,并允许您修复QT问题。)*

另请注意:
如果你有三个PROCEDURE,每个都包含一个COMMIT语句,那么你不能运行所有的三个,然后,如果在后一个中发生异常,ROLLBACK它们全部,因为前两个的更改已经是COMMIT了。
作为一般规则,不应在PROCEDUREFUNCTION中使用COMMIT,而应将其留给事务的COMMIT调用方,以便它们可以将多个操作捆绑在一起。
相反,当交易完成时,您应该在QT中输入COMMIT
您也可以在程序中使用数据行资料类型:

CREATE OR REPLACE PROCEDURE INPUT_CUSTOMER 
(
    ck       IN CUSTOMER.CUSTOMER_KEY%TYPE,
    clinic   IN CUSTOMER.CLINIC_NAME%TYPE,
    dentist  IN CUSTOMER.LICENSE_NUMBER%TYPE,
    license  IN CUSTOMER.DENTIST_NAME%TYPE,
    number_c IN CUSTOMER.PHONE_NUMBER%TYPE,
    amount   IN CUSTOMER.ORDER_AMOUNT%TYPE 
)
IS
BEGIN
    INSERT INTO CUSTOMER(CUSTOMER_KEY, CLINIC_NAME, LICENSE_NUMBER, DENTIST_NAME, PHONE_NUMBER, ORDER_AMOUNT)
    VALUES  (ck, clinic, license, dentist, number_c, amount);
END INPUT_CUSTOMER;
/

fiddle

相关问题