Dường như bạn có heredoc
chứa một lệnh SQL * Plus duy nhất, mặc dù nó có vẻ không đúng như đã lưu ý trong các nhận xét. Bạn có thể chuyển một giá trị vào heredoc
:
sqlplus -S user/[email protected] << EOF
@/opt/D2RQ/file.sql BUILDING
exit;
EOF
hoặc nếu BUILDING
là $2
trong tập lệnh của bạn:
sqlplus -S user/[email protected] << EOF
@/opt/D2RQ/file.sql $2
exit;
EOF
Nếu file.sql
của bạn có một exit
cuối cùng thì nó sẽ còn đơn giản hơn vì bạn không cần heredoc
:
sqlplus -S user/[email protected] @/opt/D2RQ/file.sql $2
Trong SQL của bạn, sau đó, bạn có thể tham khảo các tham số vị trí bằng cách sử dụng các biến thay thế:
...
}',SEM_Models('&1'),NULL,
...
&1
sẽ được thay thế bằng giá trị đầu tiên được truyền vào tập lệnh SQL, BUILDING
; bởi vì đó là một chuỗi nó vẫn cần được đặt trong dấu ngoặc kép. Bạn có thể muốn set verify off
dừng lại nếu hiển thị cho bạn các thay thế trong đầu ra.
Bạn có thể chuyển nhiều giá trị và tham chiếu đến chúng một cách tuần tự giống như bạn thực hiện các tham số vị trí trong tập lệnh shell - tham số được truyền đầu tiên là &1
, thứ hai là &2
, v.v. Bạn có thể sử dụng các biến thay thế ở bất kỳ đâu trong tập lệnh SQL, vì vậy chúng có thể được sử dụng làm bí danh cột mà không có vấn đề gì - bạn chỉ cần cẩn thận thêm một tham số bổ sung mà bạn thêm nó vào cuối danh sách (điều này khiến đánh số không theo thứ tự trong tập lệnh, có thể) hoặc điều chỉnh mọi thứ để khớp:
sqlplus -S user/[email protected] << EOF
@/opt/D2RQ/file.sql total_count BUILDING
exit;
EOF
hoặc:
sqlplus -S user/[email protected] << EOF
@/opt/D2RQ/file.sql total_count $2
exit;
EOF
Nếu total_count
đang được chuyển đến tập lệnh shell của bạn, sau đó chỉ cần sử dụng tham số vị trí của nó, $4
hay bất cứ cái gì. Và SQL của bạn sau đó sẽ là:
SELECT COUNT(*) as &1
FROM TABLE(SEM_MATCH(
'{
?s rdf:type :ProcessSpec .
?s ?p ?o
}',SEM_Models('&2'),NULL,
SEM_ALIASES(SEM_ALIAS('','http://VISION/DataSource/SEMANTIC_CACHE#')),NULL));
Nếu bạn chuyển nhiều giá trị, bạn có thể thấy rõ ràng hơn khi sử dụng các tham số vị trí để xác định các tham số được đặt tên, vì vậy mọi vấn đề về thứ tự đều được xử lý khi bắt đầu tập lệnh, nơi chúng dễ duy trì hơn:
define MY_ALIAS = &1
define MY_MODEL = &2
SELECT COUNT(*) as &MY_ALIAS
FROM TABLE(SEM_MATCH(
'{
?s rdf:type :ProcessSpec .
?s ?p ?o
}',SEM_Models('&MY_MODEL'),NULL,
SEM_ALIASES(SEM_ALIAS('','http://VISION/DataSource/SEMANTIC_CACHE#')),NULL));
Từ câu hỏi riêng của bạn, có thể bạn chỉ muốn:
SELECT COUNT(*) as &1
FROM TABLE(SEM_MATCH(
'{
?s rdf:type :ProcessSpec .
?s ?p ?o
}',SEM_Models('&1'),NULL,
SEM_ALIASES(SEM_ALIAS('','http://VISION/DataSource/SEMANTIC_CACHE#')),NULL));
... vì vậy bí danh sẽ có cùng giá trị mà bạn đang truy vấn (giá trị trong $2
hoặc BUILDING
trong phần gốc của câu trả lời). Bạn có thể tham chiếu đến biến thay thế bao nhiêu lần tùy ý.
Điều đó có thể không dễ sử dụng nếu bạn đang chạy nó nhiều lần, vì nó sẽ xuất hiện dưới dạng tiêu đề phía trên giá trị đếm trong mỗi bit đầu ra. Có thể điều này sẽ dễ phân tích cú pháp hơn sau này:
select '&1' as QUERIED_VALUE, COUNT(*) as TOTAL_COUNT
Nếu bạn set pages 0
và set heading off
, các cuộc gọi lặp lại của bạn có thể xuất hiện trong một danh sách gọn gàng. Bạn cũng có thể cần phải set tab off
và có thể sử dụng rpad('&1', 20)
hoặc tương tự để làm cho cột đó luôn có cùng chiều rộng. Hoặc nhận kết quả dưới dạng CSV với:
select '&1' ||','|| COUNT(*)
Phụ thuộc vào những gì bạn đang sử dụng kết quả cho ...