選択できません*(ORA-00932:一貫性のないデータ型:予期されたCHARがADTを取得しました)

Aug 24 2020

更新更新:列名を定義することでクエリを実行できます...問題はクエリにあります SELECT *が、テーブルに100近くの列があります..それらすべてをハードコアにしてそのリストを維持したくない..なぜできるのか使ってないSELECT *


私は単にボタンを作成しようとしています。ユーザーが.csvファイルとしてエクスポートする3つのテーブルのいずれかを選択できるフロントエンド。選択肢をクリックすると->選択肢がPHPに返され、table:which;特定のテーブルがOracleデータベースで照会され、ブラウザにダウンロードされます。以下は、エラーを返す私の試みです。


jQueryフロントエンド呼び出し(エクスポートボタンのクリック):

$('#export' + '.' + crnt).click(function(){
      let which = crnt;
      window.location.href = "export?table="+which;
});

スリムルート経由のPHP:

<?php
    
$app->post('/export', function ($request, $response, $args) { $which = $_POST['table']; $config = parse_ini_file(__DIR__ . '/../../xx/xx.ini');
    $dbuser = $config['dbuser'];
    $dbpass = $config['dbpass'];
    $dbhost = $config['dbhost'];
    $dbname = $config['dbname'];
    $constr = $dbhost.'/'.$dbname; $conn = oci_pconnect($dbuser, $dbpass, $constr, 'XXX'); if ($which == 'table_1'){
        $sql = 'SELECT * FROM app.table_1'; $columnsql = 'SELECT column_name FROM app.table_1';
    } else if ($which == 'table_2'){ $sql = 'SELECT * FROM app.table_2';
        $columnsql = 'SELECT column_name FROM app.table_2'; } else if ($which == 'table_3'){
        $sql = 'SELECT * FROM app.table_3'; $columnsql = 'SELECT column_name FROM app.table_3';
    }

    $stmt = oci_parse($conn, $sql); $columnstmt = oci_parse($conn, $columnsql); 
    oci_execute($stmt); oci_execute($columnstmt);

    $columnnames = oci_fetch_array($columnstmt, OCI_ASSOC);
    $output = fopen("php://output", "w"); fputcsv($output, $columnnames); while ($row = oci_fetch_array($stmt, OCI_ASSOC)) { fputcsv($output, $row); } fclose($output);

    header("Content-Type: text/csv; charset=utf-8");
    header("Content-Disposition: attachment; filename=$which.csv"); if (!@oci_execute($stmt)) {
       $error = oci_error($stmt);
       throw new Exception($error['message']); } if (!@oci_execute($columnstmt)) {
       $error = oci_error($columnstmt);
       throw new Exception($error['message']);
    }

});

エラー500:上記は私の開発ツールネットワークコンソール->プレビュー応答タブで以下のエラーを返します:


アップデート:

私は今、すべてのpostインスタンスを->getどの修正されたpostメソッドが許可されていないメッセージを受信しているのに更新しましたORA inconsistent datatypes error...これheadersはphpの私と関係がありますか?どこに含めましたか?ajax通話でもデータ型を指定する必要がありますか?潜在的な*ADT*データ型をどのように処理しますか?

回答

Zeppi Sep 02 2020 at 19:19

抽出列に対する奇妙な要求です。そんなことじゃないの?

select column_name from all_tab_columns where table_name = 'table_1';

OCI_ASSOCを使用します。そして、あなたは次のような機能でリクエストを保存することができます

while ($row = oci_fetch_array($stmt, OCI_ASSOC)) {
        write_head_column($output, $row);
        fputcsv($output, $row);
}

function write_head_column(&$output, $row){
  static $is_done; if(empty($is_done)){
    $head = key($row);
    fputcsv($output, $head);
    $is_done = true;
  }
}
ArturOdzelevic Sep 02 2020 at 20:53

1つ以上の列がオブジェクトのように見えます。SDO_GEOMETRYこの種の列は次のように選択できません。*次のようなものを使用する必要があります。

SELECT c.shape.Get_Dims()
FROM cola_markets c WHERE c.name = 'cola_b';

@見る https://docs.oracle.com/database/121/SPATL/sdo_geometry-methods.htm#SPATL498